[java-shib-shared] branch main updated: Improve InMemoryDirectory.

Daniel Fisher dfisher at vt.edu
Mon Jul 29 01:52:00 UTC 2024


This is an automated email from the git hooks/post-receive script.

dfisher pushed a commit to branch main
in repository java-shib-shared.

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-shared.git;a=commit;h=912ac75ae0d8ebfa142ed954521a0b3da9c0cd17

The following commit(s) were added to refs/heads/main by this push:
     new 912ac75a Improve InMemoryDirectory.
912ac75a is described below

commit 912ac75ae0d8ebfa142ed954521a0b3da9c0cd17
Author: Daniel Fisher <dfisher at vt.edu>
AuthorDate: Sat Jul 27 10:24:05 2024 -0400

    Improve InMemoryDirectory.
    
    Add support for choosing an available port.
    Add support for requiring authentication for search operations.
    Add support for adding additional LDIF after start.
---
 .../shared/testing/InMemoryDirectory.java          | 69 ++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/shib-testing/src/main/java/net/shibboleth/shared/testing/InMemoryDirectory.java b/shib-testing/src/main/java/net/shibboleth/shared/testing/InMemoryDirectory.java
index 4f3abaa6..ab3f3521 100644
--- a/shib-testing/src/main/java/net/shibboleth/shared/testing/InMemoryDirectory.java
+++ b/shib-testing/src/main/java/net/shibboleth/shared/testing/InMemoryDirectory.java
@@ -42,7 +42,9 @@ import com.unboundid.ldap.sdk.Control;
 import com.unboundid.ldap.sdk.DN;
 import com.unboundid.ldap.sdk.LDAPException;
 import com.unboundid.ldap.sdk.LDAPResult;
+import com.unboundid.ldap.sdk.OperationType;
 import com.unboundid.ldap.sdk.ResultCode;
+import com.unboundid.ldif.LDIFException;
 import com.unboundid.ldif.LDIFReader;
 import com.unboundid.util.ssl.SSLUtil;
 
@@ -80,6 +82,23 @@ public class InMemoryDirectory {
     public InMemoryDirectory(@ParameterName(name="baseDNs") @Nonnull final String[] baseDNs,
                              @ParameterName(name="ldif") @Nonnull final Resource ldif,
                              @ParameterName(name="port") @Positive final int port) {
+        this(baseDNs, ldif, port, false);
+    }
+
+    /**
+     * Constructor without STARTTLS support.
+     *
+     * @param baseDNs to use in the directory server
+     * @param ldif the LDIF resource to be imported
+     * @param port port to listen on
+     * @param requireAuthForSearch whether to require authentication in order to perform searches
+     *
+     * @throws RuntimeException if the in-memory directory cannot be created
+     */
+    public InMemoryDirectory(@ParameterName(name="baseDNs") @Nonnull final String[] baseDNs,
+                             @ParameterName(name="ldif") @Nonnull final Resource ldif,
+                             @ParameterName(name="port") @Positive final int port,
+                             @ParameterName(name="requireAuthForSearch") final boolean requireAuthForSearch) {
         Constraint.isNotNull(ldif, "LDIF resource cannot be null");
         try {
             final InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(baseDNs);
@@ -94,6 +113,9 @@ public class InMemoryDirectory {
                     null);
             config.setListenerConfigs(listenerConfig);
             config.addAdditionalBindCredentials("cn=Directory Manager", "password");
+            if (requireAuthForSearch) {
+                config.setAuthenticationRequiredOperationTypes(OperationType.SEARCH);
+            }
             addSuccessSaslBindHandlers(config);
             directoryServer = new InMemoryDirectoryServer(config);
             directoryServer.importFromLDIF(true, new LDIFReader(ldif.getInputStream()));
@@ -118,6 +140,27 @@ public class InMemoryDirectory {
                              @ParameterName(name="port") @Positive final int port,
                              @ParameterName(name="keystore") @Nonnull final Resource keystore,
                              @ParameterName(name="truststore") @Nonnull final Optional<Resource> truststore) {
+        this(baseDNs, ldif, port, false, keystore, truststore);
+    }
+
+    /**
+     * Constructor with STARTTLS support.
+     *
+     * @param baseDNs to use in the directory server
+     * @param ldif the LDIF resource to be imported
+     * @param port port to listen on
+     * @param requireAuthForSearch whether to require authentication in order to perform searches
+     * @param keystore to use for startTLS
+     * @param truststore to use for startTLS
+     *
+     * @throws RuntimeException if the in-memory directory cannot be created
+     */
+    public InMemoryDirectory(@ParameterName(name="baseDNs") @Nonnull final String[] baseDNs,
+                             @ParameterName(name="ldif") @Nonnull final Resource ldif,
+                             @ParameterName(name="port") @Positive final int port,
+                             @ParameterName(name="requireAuthForSearch") final boolean requireAuthForSearch,
+                             @ParameterName(name="keystore") @Nonnull final Resource keystore,
+                             @ParameterName(name="truststore") @Nonnull final Optional<Resource> truststore) {
         Constraint.isNotNull(ldif, "LDIF resource cannot be null");
         try {
             final InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(baseDNs);
@@ -136,6 +179,9 @@ public class InMemoryDirectory {
                     sslUtil.createSSLSocketFactory());
             config.setListenerConfigs(listenerConfig);
             config.addAdditionalBindCredentials("cn=Directory Manager", "password");
+            if (requireAuthForSearch) {
+                config.setAuthenticationRequiredOperationTypes(OperationType.SEARCH);
+            }
             addSuccessSaslBindHandlers(config);
             directoryServer = new InMemoryDirectoryServer(config);
             directoryServer.importFromLDIF(true, new LDIFReader(ldif.getInputStream()));
@@ -180,6 +226,20 @@ public class InMemoryDirectory {
         });
     }
 
+    /**
+     * Adds the supplied LDIF lines to the directory server.
+     *
+     * @param ldifLines to add
+     * @throws RuntimeException if an error occurs adding the LDIF
+     */
+    public void add(final String... ldifLines) {
+        try {
+            directoryServer.add(ldifLines);
+        } catch (LDIFException | LDAPException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     /**
      * Returns the number of open sockets.
      *
@@ -203,6 +263,15 @@ public class InMemoryDirectory {
         log.info("In-memory directory server started");
     }
 
+    /**
+     * Returns the port the server is listening on.
+     *
+     * @return  port number
+     */
+    public int getListenPort() {
+        return directoryServer.getListenPort();
+    }
+
     /**
      * Stops the directory server. Note that in general resources should be configured so that LDAP connections are
      * closed at the conclusion of a test method or test class.

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list