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

juanpablo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git

commit b553be9b9882a529133c414cc9386b32f62743a2
Author: Alex O'Ree <alexo...@apache.org>
AuthorDate: Sat Mar 30 10:45:49 2024 -0400

    JSPWIKI-1188 system property expansion
---
 .../java/org/apache/wiki/util/PropertyReader.java  | 22 +++++++++++++++++++++-
 .../org/apache/wiki/util/PropertyReaderTest.java   |  8 ++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git 
a/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java 
b/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java
index ac1fa9139..70daf8325 100644
--- a/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java
+++ b/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java
@@ -292,13 +292,33 @@ public final class PropertyReader {
         Enumeration< ? > propertyList = properties.propertyNames();
         while( propertyList.hasMoreElements() ) {
             final String propertyName = ( String )propertyList.nextElement();
-            final String propertyValue = properties.getProperty( propertyName 
);
+            String propertyValue = properties.getProperty( propertyName );
 
             if ( propertyName.startsWith( PARAM_VAR_DECLARATION ) ) {
                 final String varName = propertyName.substring( 4 ).trim();
                 final String varValue = propertyValue.trim();
                 vars.put( varName, varValue );
             }
+            boolean subsitution=false;
+            while ( propertyValue.contains( "${" ) && propertyValue.contains( 
"}" ) ) {
+                int start = propertyValue.indexOf( "${" );
+                int end = propertyValue.indexOf( "}" );
+                if ( start == -1 || end == -1 ) break;
+                if ( end > start ) {
+                    String substring = propertyValue.substring( start, end 
).replace( "${", "" ).replace( "}", "" );
+                    if (System.getProperty( substring ) != null ) {
+                        propertyValue = propertyValue.replace( "${" + 
substring + "}", System.getProperty( substring ) );
+                        subsitution = true;
+                    } else break;
+                } else {
+                    //this would be a strange issue of a value like
+                    // foo}${bar
+                    break;
+                }
+            }
+            if ( subsitution ) {
+                properties.setProperty( propertyName, propertyValue );
+            }
         }
 
         //now, substitute $ values in property values with vars...
diff --git 
a/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java 
b/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java
index f4e21b744..f126b10f6 100644
--- a/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java
+++ b/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java
@@ -68,6 +68,14 @@ public class PropertyReaderTest {
         Assertions.assertTrue( p.getProperty( "jspwiki.xyz" ).endsWith( "test 
basedir" ) ); //don't touch this
         Assertions.assertFalse( p.getProperty( "jspwiki.workDir" ).endsWith( 
"$basedir/wrk/" ) );
     }
+     @Test
+    public void testSystemPropertyInjection() {
+        System.setProperty("FOO", "BAR");
+        final Properties p = new Properties();
+        p.put( "jspwiki.fileSystemProvider.pageDir", "${FOO}/www/" );
+        PropertyReader.expandVars( p );
+        Assertions.assertTrue( p.getProperty( 
"jspwiki.fileSystemProvider.pageDir" ).equals( "BAR/www/" ) );
+    }
 
     @Test
     public void testVariableExpansion2() {

Reply via email to