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

Reply via email to