From 930209c3f936dfaba98b2459f41d8ded1b96fbd7 Mon Sep 17 00:00:00 2001
From: Shawn McKinney <smckinney@apache.org>
Date: Tue, 25 Feb 2025 08:18:30 -0600
Subject: [PATCH] these changes are an antipattern for how to handle
 connections. do not use in prod

---
 src/main/java/com/symas/LoadBase.java     | 32 ++++++++++++
 src/main/java/com/symas/RegisterUser.java | 63 ++++++++++++++---------
 src/main/java/com/symas/UserImpl.java     | 38 ++++++++++++++
 3 files changed, 110 insertions(+), 23 deletions(-)

diff --git a/src/main/java/com/symas/LoadBase.java b/src/main/java/com/symas/LoadBase.java
index 75fcd2b..1d36e88 100644
--- a/src/main/java/com/symas/LoadBase.java
+++ b/src/main/java/com/symas/LoadBase.java
@@ -1,6 +1,7 @@
 /* Copyright (c) 2024 by Symas Corporation. */
 package com.symas;
 
+import java.util.ArrayList;
 import org.apache.commons.lang.StringUtils;
 import org.apache.directory.fortress.core.*;
 import org.apache.directory.fortress.core.model.Group;
@@ -13,7 +14,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.directory.ldap.client.api.LdapConnection;
 import static org.junit.Assert.assertNotNull;
 
 /**
@@ -57,6 +60,8 @@ public abstract class LoadBase extends AbstractJavaSamplerClient
     protected String filters[] = null;
     protected String attrs[] = null;
     protected Boolean attrsonly = false;
+    
+    //protected List<LdapConnection> connections = new ArrayList();
 
     private static AtomicInteger count = new AtomicInteger(0);
     protected static AtomicInteger test_failures = new AtomicInteger(0);
@@ -456,6 +461,33 @@ public abstract class LoadBase extends AbstractJavaSamplerClient
     public void teardownTest( JavaSamplerContext samplerContext )
     {
         LOG.info( "JMETER TEARDOWN TID: {}, FAILED TESTS: {}", getThreadId(), test_failures.get() );
+        try
+        {
+            LOG.info( "JMETER TEARDOWN TID: {}, SLEEP", getThreadId() );
+            Thread.sleep( 1800001 );
+        }
+        catch (Exception e)
+        {
+            // ignore
+        }
+        
+        /*
+        if( connections != null && connections.size() > 0 )
+        {
+            LOG.info( "JMETER TEARDOWN CLOSE CONNECTIONS: {}", connections.size() );
+            UserImpl userImpl = new UserImpl();
+            for ( LdapConnection ld : connections )
+            {
+                try
+                {
+                  userImpl.closeConnectionUser( ld );
+                }
+                catch ( RuntimeException e )
+                {
+                }
+            }
+        }
+        */
         System.exit(0);
     }
 
diff --git a/src/main/java/com/symas/RegisterUser.java b/src/main/java/com/symas/RegisterUser.java
index 655e7bf..4579d4e 100644
--- a/src/main/java/com/symas/RegisterUser.java
+++ b/src/main/java/com/symas/RegisterUser.java
@@ -35,7 +35,6 @@ public class RegisterUser extends LoadBase
         int count = getKey();
         String userId  = hostname + '-' + qualifier + '-' + count;
         SampleResult sampleResult = new SampleResult();
-        boolean testDuplicate = false;
 
         // Service account:
         User bindUser = new User(
@@ -56,26 +55,48 @@ public class RegisterUser extends LoadBase
         {
             sampleResult.sampleStart();
             ld = userImpl.bind( bindUser );
+            ConnImpl connImpl = new ConnImpl();            
+            //ld = connImpl.getConnection();
+            //userImpl.bind( ld, bindUser );                        
+            if ( ! verify )
+            {
+                // Search User 1:
+                boolean result = verify( inUser, Op.DEL, ld );
+                assertFalse( result );
+                
+                connImpl.closeConnection( ld );
+                ld = connImpl.getConnection();
+                userImpl.bind( ld, bindUser );                        
 
-            // Search User 1:
-            boolean result = verify( inUser, Op.DEL, ld );
-            assertFalse( result );
-
-            // Add User:
-            User outUser = userImpl.create( inUser, ld );
-            assertNotNull( outUser );
+                // Add User:
+                User outUser = userImpl.create( inUser, ld );
+                assertNotNull( outUser );
 
-            // Mod Group:
-            Group inGroup = new Group( name );
-            //String id = hostname + '-' + qualifier + '-' + count;
-            LOG.debug( "threadid: {}, groupName: {} userid: {}", getThreadId(), name, inUser.getUserId() );
-            Group outGroup = groupImpl.assign( inGroup, inUser.getUserId(), ld );
-            assertNotNull( outGroup );
+                connImpl.closeConnection( ld );
+                ld = connImpl.getConnection();
+                userImpl.bind( ld, bindUser );                        
+                
+                // Mod Group:
+                Group inGroup = new Group( name );
+                //String id = hostname + '-' + qualifier + '-' + count;
+                LOG.debug( "threadid: {}, groupName: {} userid: {}", getThreadId(), name, inUser.getUserId() );
+                Group outGroup = groupImpl.assign( inGroup, inUser.getUserId(), ld );
+                assertNotNull( outGroup );                
 
-            // Search User 2:
-            result = verify( inUser, Op.ADD, ld );
-            assertTrue( result );
+                connImpl.closeConnection( ld );
+                ld = connImpl.getConnection();
+                userImpl.bind( ld, bindUser );                        
+                
+                // Search User 2:
+                result = verify( inUser, Op.ADD, ld );
+                //assertTrue( result );                
+            }
 
+            sampleResult.setSampleCount( 1 );
+            sampleResult.sampleEnd();
+            sampleResult.setBytes(1);
+            sampleResult.setResponseMessage("test completed TID: " + getThreadId() + " UID: " + userId);
+            sampleResult.setSuccessful(true);
             if( sleep > 0 )
             {
                 try
@@ -87,11 +108,6 @@ public class RegisterUser extends LoadBase
                     Thread.currentThread().interrupt();
                 }
             }
-            sampleResult.setSampleCount( 1 );
-            sampleResult.sampleEnd();
-            sampleResult.setBytes(1);
-            sampleResult.setResponseMessage("test completed TID: " + getThreadId() + " UID: " + userId);
-            sampleResult.setSuccessful(true);
         }
         catch ( org.apache.directory.fortress.core.CreateException ce )
         {
@@ -107,7 +123,8 @@ public class RegisterUser extends LoadBase
         }
         finally
         {
-            userImpl.closeConnectionUser( ld );
+            //userImpl.closeConnectionUser( ld );
+            //connections.add( ld );
         }
 
         return sampleResult;
diff --git a/src/main/java/com/symas/UserImpl.java b/src/main/java/com/symas/UserImpl.java
index e0fe579..9fd372a 100755
--- a/src/main/java/com/symas/UserImpl.java
+++ b/src/main/java/com/symas/UserImpl.java
@@ -463,6 +463,11 @@ final class UserImpl extends LdapDataProvider
         closeUserConnection( ld );
     }
 
+    void closeConnectionPools( LdapConnection ld )
+    {
+        closeUserConnection( ld );
+    }
+
     /**
      * @param user
      * @return
@@ -654,6 +659,39 @@ final class UserImpl extends LdapDataProvider
     }
 
 
+    void bind( LdapConnection ld, User user ) throws FinderException, PasswordException
+    {
+        Session session;
+        String userDn = user.getUserId();
+
+        try
+        {
+            session = new ObjectFactory().createSession();
+            session.setAuthenticated( false );
+            session.setUserId( user.getUserId() );
+            BindResponse bindResponse = bind( ld, userDn, user.getPassword() );
+            String info;
+
+            if ( bindResponse.getLdapResult().getResultCode() != ResultCodeEnum.SUCCESS )
+            {
+                info = "PASSWORD INVALID for userId [" + user.getUserId() + "], resultCode [" +
+                        bindResponse.getLdapResult().getResultCode() + "]";
+                session.setMsg( info );
+                session.setErrorId( GlobalErrIds.USER_PW_INVLD );
+            }
+        }
+        catch ( LdapAuthenticationException e )
+        {
+            String info = "checkPassword INVALID PASSWORD for userId [" + user.getUserId() + "] LdapAuthenticationException [" + e + "]";
+            throw new PasswordException( GlobalErrIds.USER_PW_INVLD, info );
+        }
+        catch ( LdapException e )
+        {
+            String error = "checkPassword userId [" + user.getUserId() + "] caught LDAPException=" + e;
+            throw new FinderException( GlobalErrIds.USER_READ_FAILED, error, e );
+        }
+    }
+
     boolean changePassword( User entity, String newPassword ) throws SecurityException
     {
         boolean rc = true;
-- 
GitLab