You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2022/09/10 06:39:08 UTC
[camel] 01/02: CAMEL-18456: added basic auth support for camel-test-infra-jetty
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 <an...@gmail.com>
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());