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

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git


The following commit(s) were added to refs/heads/master by this push:
     new 6979e4508b FELIX-6500 : Apply filtering for post requests
6979e4508b is described below

commit 6979e4508bae7a6908c11b92b01a7261707dc052
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Wed May 4 08:36:43 2022 +0200

    FELIX-6500 : Apply filtering for post requests
---
 .../internal/configuration/ConfigAdminSupport.java | 20 ++++++-
 .../internal/configuration/ConfigJsonSupport.java  | 61 +++++++++-------------
 .../internal/configuration/ConfigManager.java      |  6 +--
 .../configuration/ConfigJsonSupportTest.java       | 21 +++-----
 4 files changed, 54 insertions(+), 54 deletions(-)

diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java
index e48a30c26d..337a42dd10 100644
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java
@@ -21,6 +21,8 @@ package org.apache.felix.webconsole.internal.configuration;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -79,7 +81,7 @@ class ConfigAdminSupport {
     }
 
     public ConfigJsonSupport getJsonSupport() {
-        return new ConfigJsonSupport(this.servletSupport, 
getMetaTypeSupport(), this.service);
+        return new ConfigJsonSupport(this.servletSupport, 
getMetaTypeSupport(), this.service, this.configurationHandlers);
     }
 
     MetaTypeServiceSupport getMetaTypeSupport() {
@@ -110,6 +112,17 @@ class ConfigAdminSupport {
         if ( props == null ) {
             props = new Hashtable<>();
         }
+        // filter properties and keep filtered values
+        final List<String> allowedProperties = 
this.getJsonSupport().getPropertyNamesForForm(config.getFactoryPid(), 
config.getPid(), props);
+        final Map<String, Object> allowedValues = new HashMap<>();
+        final Dictionary<String, Object> origProps = config.getProperties();
+        if ( origProps != null ) {
+            for(final String name : Collections.list(props.keys())) {
+                if ( !allowedProperties.contains(name) ) {
+                    allowedValues.put(name, origProps.get(name));
+                }
+            }
+        }
 
         final MetaTypeServiceSupport mtss = getMetaTypeSupport();
         final Map<String, MetatypePropertyDescriptor> adMap = ( mtss != null ) 
? mtss.getAttributeDefinitionMap( config, null ) : new HashMap<>();
@@ -256,6 +269,11 @@ class ConfigAdminSupport {
             h.updateConfiguration(factoryPid, pid, props);
         }
 
+        // reapply allowed values
+        for(final Map.Entry<String, Object> allowed : 
allowedValues.entrySet()) {
+            props.put(allowed.getKey(), allowed.getValue());
+        }
+
         final String location = request.getParameter(ConfigManager.LOCATION);
         if ( location == null || location.trim().length() == 0 || 
ConfigManager.UNBOUND_LOCATION.equals(location) )
         {
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
index 6e4e96fc93..760101ac69 100644
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
@@ -53,7 +53,6 @@ import org.osgi.service.cm.ManagedService;
 import org.osgi.service.cm.ManagedServiceFactory;
 import org.osgi.service.metatype.AttributeDefinition;
 import org.osgi.service.metatype.ObjectClassDefinition;
-import org.osgi.util.tracker.ServiceTracker;
 
 
 class ConfigJsonSupport {
@@ -64,23 +63,27 @@ class ConfigJsonSupport {
     
     private final ConfigurationAdmin configurationAdmin;
 
+    private final List<ConfigurationHandler> configurationHandlers;
+
     public ConfigJsonSupport(final ServletSupport support, 
             final MetaTypeServiceSupport mtss, 
-            final ConfigurationAdmin cfgAdmin) {
+            final ConfigurationAdmin cfgAdmin,
+            final List<ConfigurationHandler> cfgHandlers) {
         this.servletSupport = support;
         this.mtss = mtss;
         this.configurationAdmin = cfgAdmin;
+        this.configurationHandlers = cfgHandlers;
     }
 
     public void printConfigurationJson( final PrintWriter pw, final String 
pid, final Configuration config, final String pidFilter,
-            final String locale, ServiceTracker<ConfigurationHandler, 
ConfigurationHandler> serviceTracker) {
+            final String locale) {
 
         final JSONWriter result = new JSONWriter( pw );
 
         if ( pid != null ) {
             try{
                 result.object();
-                this.configForm( result, pid, config, pidFilter, locale, 
serviceTracker );
+                this.configForm( result, pid, config, pidFilter, locale );
                 result.endObject();
             } catch ( final Exception e ) {
                 this.servletSupport.log( "Error reading configuration PID " + 
pid, e );
@@ -93,30 +96,24 @@ class ConfigJsonSupport {
      * Get the list of property names for the form and filter the properties 
based on this list
      */
     List<String> getPropertyNamesForForm(final String factoryPid, final String 
pid,
-        final Dictionary<String, Object> props,
-        final ServiceTracker<ConfigurationHandler, ConfigurationHandler> 
serviceTracker) 
+        final Dictionary<String, Object> props) 
     throws IOException {
         final List<String> names = new 
ArrayList<>(Collections.list(props.keys()));
-        if (  serviceTracker != null && !names.isEmpty()) {
-            final Object[] services = serviceTracker.getServices();
-            if ( services != null ) {
-                // fill remove list with all names
-                final List<String> removeList = new ArrayList<>(names);
-                for(final Object o : services) {
-                    final ConfigurationHandler handler = 
(ConfigurationHandler)o;
-                    handler.filterProperties(factoryPid, pid, names);
-                }
-                // update remove list
-                removeList.removeAll(names);
-                // remove properties
-                removeList.forEach(props::remove);
+        if (  !configurationHandlers.isEmpty() && !names.isEmpty()) {
+            // fill remove list with all names
+            final List<String> removeList = new ArrayList<>(names);
+            for(final ConfigurationHandler handler : configurationHandlers) {
+                handler.filterProperties(factoryPid, pid, names);
             }
+            // update remove list
+            removeList.removeAll(names);
+            // remove properties
+            removeList.forEach(props::remove);
         }
         return names;
     }
 
-    void configForm( final JSONWriter json, final String pid, final 
Configuration config, final String pidFilter, final String locale, 
-        final ServiceTracker<ConfigurationHandler, ConfigurationHandler> 
serviceTracker )
+    void configForm( final JSONWriter json, final String pid, final 
Configuration config, final String pidFilter, final String locale )
     throws IOException {
         json.key( ConfigManager.PID );
         json.value( pid );
@@ -133,7 +130,7 @@ class ConfigJsonSupport {
         if ( props == null ) {
             props = new Hashtable<>();
         }
-        final List<String> keys = getPropertyNamesForForm(config != null ? 
config.getFactoryPid() : null, pid, props, serviceTracker);
+        final List<String> keys = getPropertyNamesForForm(config != null ? 
config.getFactoryPid() : null, pid, props);
 
         boolean doSimpleMerge = true;
         if ( this.mtss != null ) {
@@ -294,11 +291,7 @@ class ConfigJsonSupport {
         return null;
     }
 
-    final boolean listConfigurations( final JSONWriter jw, final String 
pidFilter, final String locale, final Locale loc ) {
-        return listConfigurations( jw, pidFilter, locale, loc, null );
-    }
-
-    final boolean listConfigurations(final JSONWriter jw, final String 
pidFilter, final String locale, final Locale loc , final 
ServiceTracker<ConfigurationHandler, ConfigurationHandler> serviceTracker ) {
+    final boolean listConfigurations(final JSONWriter jw, final String 
pidFilter, final String locale, final Locale loc ) {
         boolean hasConfigurations = false;
         try {
             // start with ManagedService instances
@@ -357,15 +350,11 @@ class ConfigJsonSupport {
 
                 final Configuration c = ConfigurationUtil.findConfiguration( 
this.configurationAdmin, id );
                 Configuration config = c;
-                if (serviceTracker != null) {
-                    Object[] services = serviceTracker.getServices();
-                    if (services != null) {
-                        for(final Object o : services) {
-                            ConfigurationHandler handler = 
(ConfigurationHandler)o;
-                            if 
(!handler.listConfiguration(config.getFactoryPid(), config.getPid())) {
-                                config = null;
-                                break;
-                            }
+                if (!this.configurationHandlers.isEmpty()) {
+                    for(final ConfigurationHandler handler : 
this.configurationHandlers) {
+                        if (!handler.listConfiguration(config.getFactoryPid(), 
config.getPid())) {
+                            config = null;
+                            break;
                         }
                     }
                 }
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
index 8882a368e2..71843679a8 100644
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
@@ -198,7 +198,7 @@ public class ConfigManager extends SimpleWebConsolePlugin 
implements OsgiManager
         response.setCharacterEncoding( "UTF-8" ); //$NON-NLS-1$
         final Locale loc = Util.getLocale( request );
         final String locale = ( loc != null ) ? loc.toString() : null;
-        cas.getJsonSupport().printConfigurationJson( response.getWriter(), 
pid, config, pidFilter, locale, spiTracker );
+        cas.getJsonSupport().printConfigurationJson( response.getWriter(), 
pid, config, pidFilter, locale );
     }
 
 
@@ -305,7 +305,7 @@ public class ConfigManager extends SimpleWebConsolePlugin 
implements OsgiManager
                             {
                                 pw.print( ',' );
                             }
-                            ca.getJsonSupport().printConfigurationJson( pw, 
config.getPid(), config, null, locale, spiTracker);
+                            ca.getJsonSupport().printConfigurationJson( pw, 
config.getPid(), config, null, locale );
                             printComma = true;
                         }
                     }
@@ -399,7 +399,7 @@ public class ConfigManager extends SimpleWebConsolePlugin 
implements OsgiManager
         boolean hasConfigs = true;
         if ( cas != null )
         {
-            hasConfigs = cas.getJsonSupport().listConfigurations( jw, 
pidFilter, locale, loc, spiTracker);
+            hasConfigs = cas.getJsonSupport().listConfigurations( jw, 
pidFilter, locale, loc);
             cas.getJsonSupport().listFactoryConfigurations( jw, pidFilter, 
locale );
         }
         if ( !hasConfigs && !hasMetatype && cas != null ) {
diff --git 
a/webconsole/src/test/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupportTest.java
 
b/webconsole/src/test/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupportTest.java
index e2c4937167..8f992bbf18 100644
--- 
a/webconsole/src/test/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupportTest.java
+++ 
b/webconsole/src/test/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupportTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
@@ -30,21 +31,17 @@ import java.util.List;
 import org.apache.felix.webconsole.spi.ConfigurationHandler;
 import org.apache.felix.webconsole.spi.ValidationException;
 import org.junit.Test;
-import org.mockito.Mockito;
-import org.osgi.util.tracker.ServiceTracker;
 
 public class ConfigJsonSupportTest {
 
     @Test public void testGetPropertyNamesForFormNoHandler() throws 
IOException {
-        final ConfigJsonSupport support = new ConfigJsonSupport(null, null, 
null);
-        final ServiceTracker<ConfigurationHandler, ConfigurationHandler> 
tracker = Mockito.mock(ServiceTracker.class);
-        Mockito.when(tracker.getServices()).thenReturn(null);
+        final ConfigJsonSupport support = new ConfigJsonSupport(null, null, 
null, Collections.emptyList());
 
         final Dictionary<String, Object> dict = new Hashtable<>();
         dict.put("a", "1");
         dict.put("b", "2");
 
-        final List<String> names = support.getPropertyNamesForForm("f", "p", 
dict, tracker);
+        final List<String> names = support.getPropertyNamesForForm("f", "p", 
dict);
         assertEquals(2, names.size());
         assertTrue(names.contains("a"));
         assertTrue(names.contains("b"));
@@ -55,8 +52,6 @@ public class ConfigJsonSupportTest {
     }
 
     @Test public void testGetPropertyNamesForFormHandlerNoFiltering() throws 
IOException {
-        final ConfigJsonSupport support = new ConfigJsonSupport(null, null, 
null);
-        final ServiceTracker<ConfigurationHandler, ConfigurationHandler> 
tracker = Mockito.mock(ServiceTracker.class);
         final ConfigurationHandler handler = new ConfigurationHandler() {
 
             @Override
@@ -78,13 +73,13 @@ public class ConfigJsonSupportTest {
             }
             
         };
-        Mockito.when(tracker.getServices()).thenReturn(new Object[] {handler});
+        final ConfigJsonSupport support = new ConfigJsonSupport(null, null, 
null, Collections.singletonList(handler));
 
         final Dictionary<String, Object> dict = new Hashtable<>();
         dict.put("a", "1");
         dict.put("b", "2");
 
-        final List<String> names = support.getPropertyNamesForForm("f", "p", 
dict, tracker);
+        final List<String> names = support.getPropertyNamesForForm("f", "p", 
dict);
         assertEquals(2, names.size());
         assertTrue(names.contains("a"));
         assertTrue(names.contains("b"));
@@ -95,8 +90,6 @@ public class ConfigJsonSupportTest {
     }
 
     @Test public void testGetPropertyNamesForFormHandlerFiltering() throws 
IOException {
-        final ConfigJsonSupport support = new ConfigJsonSupport(null, null, 
null);
-        final ServiceTracker<ConfigurationHandler, ConfigurationHandler> 
tracker = Mockito.mock(ServiceTracker.class);
         final ConfigurationHandler handler = new ConfigurationHandler() {
 
             @Override
@@ -125,13 +118,13 @@ public class ConfigJsonSupportTest {
             }
             
         };
-        Mockito.when(tracker.getServices()).thenReturn(new Object[] {handler});
+        final ConfigJsonSupport support = new ConfigJsonSupport(null, null, 
null, Collections.singletonList(handler));
 
         final Dictionary<String, Object> dict = new Hashtable<>();
         dict.put("a", "1");
         dict.put("b", "2");
 
-        final List<String> names = support.getPropertyNamesForForm("f", "p", 
dict, tracker);
+        final List<String> names = support.getPropertyNamesForForm("f", "p", 
dict);
         assertEquals(1, names.size());
         assertTrue(names.contains("a"));
 

Reply via email to