This is an automated email from the ASF dual-hosted git repository. orpiske pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 12714fc2f6d64da327ec206868f3ea0e6403b8c8 Author: Otavio Rodolfo Piske <[email protected]> AuthorDate: Fri Sep 9 15:17:12 2022 +0200 CAMEL-18456: added basic auth support for camel-test-infra-jetty --- test-infra/camel-test-infra-jetty/pom.xml | 5 +++ .../infra/jetty/services/JettyConfiguration.java | 21 +++++++++ .../jetty/services/JettyConfigurationBuilder.java | 15 ++++++- .../infra/jetty/services/JettyEmbeddedService.java | 50 +++++++++++++++++++++- 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/test-infra/camel-test-infra-jetty/pom.xml b/test-infra/camel-test-infra-jetty/pom.xml index 6ec3bbb5e3b..efe071c016d 100644 --- a/test-infra/camel-test-infra-jetty/pom.xml +++ b/test-infra/camel-test-infra-jetty/pom.xml @@ -40,6 +40,11 @@ <type>test-jar</type> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-util</artifactId> + </dependency> + <dependency> <groupId>org.awaitility</groupId> <artifactId>awaitility</artifactId> diff --git a/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfiguration.java b/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfiguration.java index ac67fafe671..52210ef20ca 100644 --- a/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfiguration.java +++ b/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfiguration.java @@ -22,10 +22,12 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import javax.net.ssl.SSLContext; import javax.servlet.Servlet; +import org.apache.camel.util.KeyValueHolder; import org.eclipse.jetty.servlet.ServletHolder; /** @@ -119,6 +121,8 @@ public class JettyConfiguration { private SSLContext sslContext; private List<ServletConfiguration<?>> servletConfigurations = new ArrayList<>(); private String contextPath; + private String realm; + private List<KeyValueHolder<String, String>> userInfos = new ArrayList<>(); public int getPort() { return port; @@ -151,4 +155,21 @@ public class JettyConfiguration { public List<ServletConfiguration<?>> getServletConfigurations() { return Collections.unmodifiableList(servletConfigurations); } + + void addBasicAuthUser(String username, String password, String realm) { + this.realm = Objects.requireNonNull(realm); + addBasicAuthUser(new KeyValueHolder<>(username, password)); + } + + void addBasicAuthUser(KeyValueHolder<String, String> userInfo) { + userInfos.add(userInfo); + } + + public List<KeyValueHolder<String, String>> getBasicUsers() { + return Collections.unmodifiableList(userInfos); + } + + public String getRealm() { + return realm; + } } diff --git a/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfigurationBuilder.java b/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfigurationBuilder.java index dc70caab7e0..eca93943322 100644 --- a/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfigurationBuilder.java +++ b/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyConfigurationBuilder.java @@ -52,6 +52,12 @@ public final class JettyConfigurationBuilder { return this; } + public JettyConfigurationBuilder addBasicUser(String username, String password, String realm) { + jettyConfiguration.addBasicAuthUser(username, password, realm); + + return this; + } + public JettyConfigurationBuilder withContextPath(String contextPath) { jettyConfiguration.setContextPath(contextPath); @@ -66,10 +72,15 @@ public final class JettyConfigurationBuilder { return new JettyConfigurationBuilder(); } - public static JettyConfiguration bare() { + public static JettyConfigurationBuilder bareTemplate() { // Setups a very basic Jetty server with a randomly allocated port return emptyTemplate() .withPort(0) - .build(); + .withContextPath(JettyConfiguration.ROOT_CONTEXT_PATH); + } + + public static JettyConfiguration bare() { + // Setups a very basic Jetty server with a randomly allocated port + return bareTemplate().build(); } } diff --git a/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyEmbeddedService.java b/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyEmbeddedService.java index b3b484cd3c9..a636594e4d6 100644 --- a/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyEmbeddedService.java +++ b/test-infra/camel-test-infra-jetty/src/test/java/org/apache/camel/test/infra/jetty/services/JettyEmbeddedService.java @@ -17,16 +17,26 @@ package org.apache.camel.test.infra.jetty.services; +import java.util.List; import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLContext; import org.apache.camel.test.infra.jetty.common.JettyProperties; +import org.apache.camel.util.KeyValueHolder; import org.awaitility.Awaitility; +import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.security.ConstraintSecurityHandler; +import org.eclipse.jetty.security.HashLoginService; +import org.eclipse.jetty.security.SecurityHandler; +import org.eclipse.jetty.security.UserStore; +import org.eclipse.jetty.security.authentication.BasicAuthenticator; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.util.security.Constraint; +import org.eclipse.jetty.util.security.Credential; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; @@ -65,6 +75,38 @@ public class JettyEmbeddedService implements JettyService, BeforeEachCallback, A return connector; } + private SecurityHandler basicAuth(List<KeyValueHolder<String, String>> userInfoList, String realm) { + + HashLoginService l = new HashLoginService(); + UserStore us = new UserStore(); + + for (var userInfo : userInfoList) { + // In order: data1 == username, data2 == password + us.addUser(userInfo.getKey(), Credential.getCredential(userInfo.getValue()), new String[] { "user" }); + + } + + l.setName(realm); + l.setUserStore(us); + + Constraint constraint = new Constraint(); + constraint.setName(Constraint.__BASIC_AUTH); + constraint.setRoles(new String[] { "user" }); + constraint.setAuthenticate(true); + + ConstraintMapping cm = new ConstraintMapping(); + cm.setConstraint(constraint); + cm.setPathSpec(JettyConfiguration.ServletConfiguration.ROOT_PATH_SPEC); + + ConstraintSecurityHandler csh = new ConstraintSecurityHandler(); + csh.setAuthenticator(new BasicAuthenticator()); + csh.setRealmName("myrealm"); + csh.addConstraintMapping(cm); + csh.setLoginService(l); + + return csh; + } + @Override public void registerProperties() { System.setProperty(JettyProperties.JETTY_ADDRESS, "localhost:" + getPort()); @@ -79,7 +121,13 @@ public class JettyEmbeddedService implements JettyService, BeforeEachCallback, A server.addConnector(connector); - ServletContextHandler contextHandler = new ServletContextHandler(); + ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); + + var basicUsers = jettyConfiguration.getBasicUsers(); + if (!basicUsers.isEmpty()) { + contextHandler.setSecurityHandler(basicAuth(basicUsers, jettyConfiguration.getRealm())); + } + contextHandler.setContextPath(jettyConfiguration.getContextPath()); for (JettyConfiguration.ServletConfiguration servletConfiguration : jettyConfiguration.getServletConfigurations()) { contextHandler.addServlet(servletConfiguration.buildServletHolder(), servletConfiguration.getPathSpec());
