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

amoratinos pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 44a78cc708 OAK-11899 - use default value in case config value can not 
be parsed (#2509)
44a78cc708 is described below

commit 44a78cc7082dde8aece7f9503e59aa884a98e206
Author: waldoro <[email protected]>
AuthorDate: Mon Oct 13 13:15:35 2025 +0200

    OAK-11899 - use default value in case config value can not be parsed (#2509)
    
    * OAK-11899 - use default value in case config value can not be parsed
    
    * OAK-11899 - if config parameter can not be converted, use default value
    
    * OAK-11899 - increase org.apache.jackrabbit.oak.spi.security version
---
 .../authentication/token/TokenProviderImpl.java    |  9 ++---
 .../oak/spi/security/ConfigurationParameters.java  | 27 +++++++++++++
 .../jackrabbit/oak/spi/security/package-info.java  |  2 +-
 .../spi/security/ConfigurationParametersTest.java  | 45 +++++++++++++++++++++-
 4 files changed, 76 insertions(+), 7 deletions(-)

diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenProviderImpl.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenProviderImpl.java
index f812687f33..8d1c26620a 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenProviderImpl.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenProviderImpl.java
@@ -133,11 +133,10 @@ class TokenProviderImpl implements TokenProvider, 
TokenConstants {
         this.root = root;
         this.options = options;
         this.credentialsSupport = credentialsSupport;
-
-        this.tokenExpiration = options.getConfigValue(PARAM_TOKEN_EXPIRATION, 
DEFAULT_TOKEN_EXPIRATION);
+        this.tokenExpiration = 
options.getConfigValueOrDefault(PARAM_TOKEN_EXPIRATION, 
DEFAULT_TOKEN_EXPIRATION);
         this.userManager = userConfiguration.getUserManager(root, 
NamePathMapper.DEFAULT);
         this.identifierManager = new IdentifierManager(root);
-        this.cleanupThreshold = 
options.getConfigValue(PARAM_TOKEN_CLEANUP_THRESHOLD, NO_TOKEN_CLEANUP);
+        this.cleanupThreshold = 
options.getConfigValueOrDefault(PARAM_TOKEN_CLEANUP_THRESHOLD, 
NO_TOKEN_CLEANUP);
     }
 
     //------------------------------------------------------< TokenProvider 
>---
@@ -433,7 +432,7 @@ class TokenProviderImpl implements TokenProvider, 
TokenConstants {
         Tree tokenNode = TreeUtil.addChild(parent, tokenName, TOKEN_NT_NAME);
         tokenNode.setProperty(JcrConstants.JCR_UUID, uuid);
 
-        String key = generateKey(options.getConfigValue(PARAM_TOKEN_LENGTH, 
DEFAULT_KEY_SIZE));
+        String key = 
generateKey(options.getConfigValueOrDefault(PARAM_TOKEN_LENGTH, 
DEFAULT_KEY_SIZE));
         String nodeId = getIdentifier(tokenNode);
         String token = nodeId + DELIM + key;
 
@@ -576,7 +575,7 @@ class TokenProviderImpl implements TokenProvider, 
TokenConstants {
         @Override
         public boolean resetExpiration(long loginTime) {
             // for backwards compatibility use true as default value for the 
'tokenRefresh' configuration
-            if (options.getConfigValue(PARAM_TOKEN_REFRESH, true)) {
+            if (options.getConfigValueOrDefault(PARAM_TOKEN_REFRESH, true)) {
                 Tree tokenTree = getTokenTree(this);
                 if (tokenTree.exists()) {
                     if (isExpired(loginTime)) {
diff --git 
a/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParameters.java
 
b/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParameters.java
index 00218498db..d32063ecdf 100644
--- 
a/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParameters.java
+++ 
b/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParameters.java
@@ -245,6 +245,33 @@ public final class ConfigurationParameters implements 
Map<String, Object> {
         }
     }
 
+    /**
+     * Returns the value of the configuration entry with the given {@code key}
+     * applying the following rules:
+     *
+     * <ul>
+     *     <li>If this instance doesn't contain a configuration entry with that
+     *     key, or if the entry is {@code null}, the specified {@code 
defaultValue} will be returned.</li>
+     *     <li>If the configured value is not {@code null} an attempt is made 
to convert the configured value to
+     *     match the type of the default value.</li>
+     *     <li>If the configured value can not be converted to the default 
value type the default value is returned.</li>
+     * </ul>
+     *
+     * @param key The name of the configuration option.
+     * @param defaultValue The default value to return if no such entry exists
+     * or to use for conversion.
+     * @return The original or converted configuration value or {@code 
defaultValue} if no entry for the given key exists
+     * or if a conversion error occurred.
+     */
+    @NotNull
+    public <T> T getConfigValueOrDefault(@NotNull String key, @NotNull T 
defaultValue) {
+        try {
+            return getConfigValue(key, defaultValue);
+        } catch (IllegalArgumentException e) {
+            return defaultValue;
+        }
+    }
+
     //--------------------------------------------------------< private >---
     @NotNull
     private static Class<?>  getTargetClass(@NotNull Object configProperty, 
@Nullable Object defaultValue, @Nullable Class<?> targetClass) {
diff --git 
a/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/package-info.java
 
b/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/package-info.java
index 143c1af451..aa8680f517 100644
--- 
a/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/package-info.java
+++ 
b/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/package-info.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("2.3.0")
+@Version("2.4.0")
 package org.apache.jackrabbit.oak.spi.security;
 
 import org.osgi.annotation.versioning.Version;
diff --git 
a/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParametersTest.java
 
b/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParametersTest.java
index 7ed3d0b117..40f2e56708 100644
--- 
a/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParametersTest.java
+++ 
b/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/ConfigurationParametersTest.java
@@ -601,6 +601,49 @@ public class ConfigurationParametersTest {
         options.clear();
     }
 
+    @Test
+    public void testConfigValueOrDefault() {
+        ConfigurationParameters options = 
ConfigurationParameters.of(Collections.singletonMap("test", null));
+        Object defaultObject = new TestObject("t");
+        String defaultValue = "defaultValue";
+
+        assertEquals(defaultValue, options.getConfigValueOrDefault("test", 
defaultValue));
+        assertEquals(1L, options.getConfigValueOrDefault("test", 
1L).longValue());
+        assertEquals(1.1f, options.getConfigValueOrDefault("test", 1.1f), 
0.01);
+        assertEquals(1.1d, options.getConfigValueOrDefault("test", 1.1d), 
0.01);
+        assertEquals(1, options.getConfigValueOrDefault("test", 1).intValue());
+        assertEquals(defaultObject, options.getConfigValueOrDefault("test", 
defaultObject));
+        assertFalse(options.getConfigValueOrDefault("test", false));
+    }
+
+    @Test
+    public void testConfigValueOrDefault1() {
+        ConfigurationParameters options = 
ConfigurationParameters.of(Collections.singletonMap("test", ""));
+        Object defaultObject = new TestObject("t");
+
+        assertEquals("", options.getConfigValueOrDefault("test", "value"));
+        assertEquals(1L, options.getConfigValueOrDefault("test", 
1L).longValue());
+        assertEquals(1.1f, options.getConfigValueOrDefault("test", 1.1f), 
0.01);
+        assertEquals(1.1d, options.getConfigValueOrDefault("test", 1.1d), 
0.01);
+        assertEquals(1, options.getConfigValueOrDefault("test", 1).intValue());
+        assertEquals(defaultObject, options.getConfigValueOrDefault("test", 
defaultObject));
+        assertFalse(options.getConfigValueOrDefault("test", false));
+    }
+
+    @Test
+    public void testConfigValueOrDefault2() {
+        ConfigurationParameters options = 
ConfigurationParameters.of(Collections.singletonMap("test", " "));
+        Object defaultObject = new TestObject("t");
+
+        assertEquals(" ", options.getConfigValueOrDefault("test", "value"));
+        assertEquals(1L, options.getConfigValueOrDefault("test", 
1L).longValue());
+        assertEquals(1.1f, options.getConfigValueOrDefault("test", 1.1f), 
0.01);
+        assertEquals(1.1d, options.getConfigValueOrDefault("test", 1.1d), 
0.01);
+        assertEquals(1, options.getConfigValueOrDefault("test", 1).intValue());
+        assertEquals(defaultObject, options.getConfigValueOrDefault("test", 
defaultObject));
+        assertFalse(options.getConfigValueOrDefault("test", false));
+    }
+
     private static class TestObject {
 
         private final String name;
@@ -621,4 +664,4 @@ public class ConfigurationParametersTest {
             return object == this || object instanceof TestObject && 
name.equals(((TestObject) object).name);
         }
     }
-}
\ No newline at end of file
+}

Reply via email to