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
commit 3186525c06155185ebb24a29a53300c54eb7936a Author: Carsten Ziegeler <cziege...@apache.org> AuthorDate: Thu Sep 7 07:01:11 2023 +0200 FELIX-6650 : Support id for SecurityProvider --- webconsole/pom.xml | 2 +- .../webconsole/internal/servlet/OsgiManager.java | 4 +--- .../felix/webconsole/spi/SecurityProvider.java | 7 +++++++ .../apache/felix/webconsole/spi/package-info.java | 2 +- .../servlet/OsgiManagerHttpContextTest.java | 16 +++++++-------- .../internal/servlet/OsgiManagerTest.java | 24 +++++++++++----------- 6 files changed, 30 insertions(+), 25 deletions(-) diff --git a/webconsole/pom.xml b/webconsole/pom.xml index 4b7e7aa4d1..e44f6aafb4 100644 --- a/webconsole/pom.xml +++ b/webconsole/pom.xml @@ -362,7 +362,7 @@ <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> - <version>3.0.1</version> + <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java index ebfaf00e25..6d1e3cd0d9 100644 --- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java +++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java @@ -145,8 +145,6 @@ public class OsgiManager extends HttpServlet { static final String FRAMEWORK_PROP_SECURITY_PROVIDERS = "felix.webconsole.security.providers"; - public static final String SECURITY_PROVIDER_PROPERTY_NAME = "webconsole.security.provider.id"; - static final String PROP_MANAGER_ROOT = "manager.root"; static final String PROP_DEFAULT_RENDER = "default.render"; @@ -1102,7 +1100,7 @@ public class OsgiManager extends HttpServlet { public SecurityProvider addingService(ServiceReference<SecurityProvider> reference) { final SecurityProvider provider = bundleContext.getService(reference); if (provider != null) { - final Object nameObj = reference.getProperty(SECURITY_PROVIDER_PROPERTY_NAME); + final Object nameObj = reference.getProperty(SecurityProvider.PROPERTY_ID); if (nameObj instanceof String) { final String name = (String) nameObj; final Long id = (Long) reference.getProperty(Constants.SERVICE_ID); diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/spi/SecurityProvider.java b/webconsole/src/main/java/org/apache/felix/webconsole/spi/SecurityProvider.java index 2546aae0ea..b6d113dc1e 100644 --- a/webconsole/src/main/java/org/apache/felix/webconsole/spi/SecurityProvider.java +++ b/webconsole/src/main/java/org/apache/felix/webconsole/spi/SecurityProvider.java @@ -36,6 +36,13 @@ import org.osgi.annotation.versioning.ConsumerType; @ConsumerType public interface SecurityProvider { + /** + * Security providers can be registered with an optional id which can be used + * in the configuration of the webconsole to require this provider to be available. + * @since 1.3.0 + */ + String PROPERTY_ID = "webconsole.security.provider.id"; + /** * Checks whether the authenticated user has the given role permission. * diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java b/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java index 966e63eb77..a597c548bd 100644 --- a/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java +++ b/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java @@ -16,6 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -@org.osgi.annotation.versioning.Version("1.2.0") +@org.osgi.annotation.versioning.Version("1.3.0") package org.apache.felix.webconsole.spi; diff --git a/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerHttpContextTest.java b/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerHttpContextTest.java index 6b9a6c7848..c8b17a9c7c 100644 --- a/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerHttpContextTest.java +++ b/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerHttpContextTest.java @@ -18,7 +18,7 @@ */ package org.apache.felix.webconsole.internal.servlet; -import org.apache.felix.webconsole.WebConsoleSecurityProvider; +import org.apache.felix.webconsole.spi.SecurityProvider; import org.junit.Test; import org.mockito.Mockito; import org.osgi.framework.Bundle; @@ -33,17 +33,17 @@ public class OsgiManagerHttpContextTest { public void testAuthenticate() throws Exception { BundleContext bc = Mockito.mock(BundleContext.class); Bundle bundle = Mockito.mock(Bundle.class); - OsgiManagerHttpContext ctx = new OsgiManagerHttpContext(bundle, null, "blah"); + OsgiManagerHttpContext ctx = new OsgiManagerHttpContext(bundle, null); Method authenticateMethod = OsgiManagerHttpContext.class.getDeclaredMethod( - "authenticate", new Class [] {WebConsoleSecurityProvider.class, String.class, byte[].class}); + "authenticate", new Class [] {SecurityProvider.class, String.class, byte[].class}); authenticateMethod.setAccessible(true); BasicWebConsoleSecurityProvider lastResortSp = new BasicWebConsoleSecurityProvider(bc, "foo", "bar", "blah"); assertEquals(true, authenticateMethod.invoke(ctx, lastResortSp, "foo", "bar".getBytes())); assertEquals(false, authenticateMethod.invoke(ctx, lastResortSp, "foo", "blah".getBytes())); - WebConsoleSecurityProvider sp = new TestSecurityProvider(); + SecurityProvider sp = new TestSecurityProvider(); assertEquals(true, authenticateMethod.invoke(ctx, sp, "xxx", "yyy".getBytes())); assertEquals("The default username and password should not be accepted with security provider", false, authenticateMethod.invoke(ctx, sp, "foo", "bar".getBytes())); @@ -55,10 +55,10 @@ public class OsgiManagerHttpContextTest { Mockito.when(bc.getProperty(OsgiManager.FRAMEWORK_PROP_SECURITY_PROVIDERS)).thenReturn("a"); Bundle bundle = Mockito.mock(Bundle.class); - OsgiManagerHttpContext ctx = new OsgiManagerHttpContext(bundle, null, "blah"); + OsgiManagerHttpContext ctx = new OsgiManagerHttpContext(bundle, null); Method authenticateMethod = OsgiManagerHttpContext.class.getDeclaredMethod( - "authenticate", new Class [] {WebConsoleSecurityProvider.class, String.class, byte[].class}); + "authenticate", new Class [] {SecurityProvider.class, String.class, byte[].class}); authenticateMethod.setAccessible(true); assertEquals("A required security provider is configured, logging in using " @@ -67,12 +67,12 @@ public class OsgiManagerHttpContextTest { assertEquals(false, authenticateMethod.invoke(ctx, null, "foo", "blah".getBytes())); assertEquals(false, authenticateMethod.invoke(ctx, null, "blah", "bar".getBytes())); - WebConsoleSecurityProvider sp = new TestSecurityProvider(); + SecurityProvider sp = new TestSecurityProvider(); assertEquals(true, authenticateMethod.invoke(ctx, sp, "xxx", "yyy".getBytes())); assertEquals(false, authenticateMethod.invoke(ctx, sp, "foo", "bar".getBytes())); } - private static class TestSecurityProvider implements WebConsoleSecurityProvider { + private static class TestSecurityProvider implements SecurityProvider { @Override public Object authenticate(String username, String password) { if ("xxx".equals(username) && "yyy".equals(password)) diff --git a/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerTest.java b/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerTest.java index 99ca52fdad..9eea9e8102 100644 --- a/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerTest.java +++ b/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/OsgiManagerTest.java @@ -37,7 +37,7 @@ import java.util.concurrent.atomic.AtomicReference; import javax.servlet.Servlet; -import org.apache.felix.webconsole.WebConsoleSecurityProvider; +import org.apache.felix.webconsole.spi.SecurityProvider; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; @@ -50,7 +50,7 @@ import org.osgi.framework.FrameworkUtil; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; -import org.osgi.service.http.context.ServletContextHelper; +import org.osgi.service.servlet.context.ServletContextHelper; import org.osgi.util.tracker.ServiceTrackerCustomizer; public class OsgiManagerTest { @@ -90,9 +90,9 @@ public class OsgiManagerTest { assertEquals(0, updateCalled.size()); ServiceReference sref2 = Mockito.mock(ServiceReference.class); - Mockito.when(sref2.getProperty(OsgiManager.SECURITY_PROVIDER_PROPERTY_NAME)).thenReturn("xyz"); + Mockito.when(sref2.getProperty(SecurityProvider.PROPERTY_ID)).thenReturn("xyz"); Mockito.when(sref2.getProperty(Constants.SERVICE_ID)).thenReturn(1L); - Mockito.when(bc.getService(sref2)).thenReturn(Mockito.mock(WebConsoleSecurityProvider.class)); + Mockito.when(bc.getService(sref2)).thenReturn(Mockito.mock(SecurityProvider.class)); stc.addingService(sref2); assertEquals(Collections.singleton("xyz"), mgr.registeredSecurityProviders); assertEquals(1, updateCalled.size()); @@ -111,14 +111,14 @@ public class OsgiManagerTest { } }; ServiceReference sref1 = Mockito.mock(ServiceReference.class); - Mockito.when(sref1.getProperty(OsgiManager.SECURITY_PROVIDER_PROPERTY_NAME)).thenReturn("abc"); + Mockito.when(sref1.getProperty(SecurityProvider.PROPERTY_ID)).thenReturn("abc"); Mockito.when(sref1.getProperty(Constants.SERVICE_ID)).thenReturn(1L); - Mockito.when(bc.getService(sref1)).thenReturn(Mockito.mock(WebConsoleSecurityProvider.class)); + Mockito.when(bc.getService(sref1)).thenReturn(Mockito.mock(SecurityProvider.class)); ServiceReference sref2 = Mockito.mock(ServiceReference.class); - Mockito.when(sref2.getProperty(OsgiManager.SECURITY_PROVIDER_PROPERTY_NAME)).thenReturn("xyz"); + Mockito.when(sref2.getProperty(SecurityProvider.PROPERTY_ID)).thenReturn("xyz"); Mockito.when(sref2.getProperty(Constants.SERVICE_ID)).thenReturn(2L); - Mockito.when(bc.getService(sref2)).thenReturn(Mockito.mock(WebConsoleSecurityProvider.class)); + Mockito.when(bc.getService(sref2)).thenReturn(Mockito.mock(SecurityProvider.class)); ServiceTrackerCustomizer stc = mgr.new UpdateDependenciesStateCustomizer(); stc.addingService(sref1); @@ -149,13 +149,13 @@ public class OsgiManagerTest { final List<String> invocations = new ArrayList<String>(); ServiceTrackerCustomizer stc = mgr.new UpdateDependenciesStateCustomizer() { @Override - public WebConsoleSecurityProvider addingService(ServiceReference<WebConsoleSecurityProvider> reference) { + public SecurityProvider addingService(ServiceReference<SecurityProvider> reference) { invocations.add("added:" + reference); return null; } @Override - public void removedService(ServiceReference<WebConsoleSecurityProvider> reference, WebConsoleSecurityProvider service) { + public void removedService(ServiceReference<SecurityProvider> reference, SecurityProvider service) { invocations.add("removed:" + reference); } }; @@ -245,7 +245,7 @@ public class OsgiManagerTest { final OsgiManager mgr = new OsgiManager(bc); Mockito.verify(bc, Mockito.times(1)) - .registerService(Mockito.eq(WebConsoleSecurityProvider.class), Mockito.isA(WebConsoleSecurityProvider.class), Mockito.isA(Dictionary.class)); + .registerService(Mockito.eq(SecurityProvider.class), Mockito.isA(SecurityProvider.class), Mockito.isA(Dictionary.class)); Mockito.verify(bc, Mockito.times(1)) .registerService(Mockito.eq(ServletContextHelper.class), Mockito.isA(ServletContextHelper.class), Mockito.isA(Dictionary.class)); Mockito.verify(bc, Mockito.times(1)) @@ -255,7 +255,7 @@ public class OsgiManagerTest { // Should not re-register the services, as they were already registered Mockito.verify(bc, Mockito.times(1)) - .registerService(Mockito.eq(WebConsoleSecurityProvider.class), Mockito.isA(WebConsoleSecurityProvider.class), Mockito.isA(Dictionary.class)); + .registerService(Mockito.eq(SecurityProvider.class), Mockito.isA(SecurityProvider.class), Mockito.isA(Dictionary.class)); Mockito.verify(bc, Mockito.times(1)) .registerService(Mockito.eq(ServletContextHelper.class), Mockito.isA(ServletContextHelper.class), Mockito.isA(Dictionary.class)); Mockito.verify(bc, Mockito.times(1))