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"));