This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.22 by this push:
     new e90e31d3861 add isPerson check to query for AD (#11843)
e90e31d3861 is described below

commit e90e31d3861235553673c7789a252bc4ce512027
Author: dahn <[email protected]>
AuthorDate: Wed Nov 12 16:09:28 2025 +0100

    add isPerson check to query for AD (#11843)
---
 .../cloudstack/ldap/ADLdapUserManagerImpl.java     |  18 ++-
 .../cloudstack/ldap/OpenLdapUserManagerImpl.java   | 139 ++++++++++-----------
 .../cloudstack/ldap/ADLdapUserManagerImplTest.java |   5 +-
 3 files changed, 78 insertions(+), 84 deletions(-)

diff --git 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/ADLdapUserManagerImpl.java
 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/ADLdapUserManagerImpl.java
index e96606dca2f..bf5d503e841 100644
--- 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/ADLdapUserManagerImpl.java
+++ 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/ADLdapUserManagerImpl.java
@@ -49,7 +49,7 @@ public class ADLdapUserManagerImpl extends 
OpenLdapUserManagerImpl implements Ld
         
searchControls.setReturningAttributes(_ldapConfiguration.getReturnAttributes(domainId));
 
         NamingEnumeration<SearchResult> results = context.search(basedn, 
generateADGroupSearchFilter(groupName, domainId), searchControls);
-        final List<LdapUser> users = new ArrayList<LdapUser>();
+        final List<LdapUser> users = new ArrayList<>();
         while (results.hasMoreElements()) {
             final SearchResult result = results.nextElement();
             users.add(createUser(result, domainId));
@@ -58,10 +58,8 @@ public class ADLdapUserManagerImpl extends 
OpenLdapUserManagerImpl implements Ld
     }
 
     String generateADGroupSearchFilter(String groupName, Long domainId) {
-        final StringBuilder userObjectFilter = new StringBuilder();
-        userObjectFilter.append("(objectClass=");
-        userObjectFilter.append(_ldapConfiguration.getUserObject(domainId));
-        userObjectFilter.append(")");
+
+        final StringBuilder userObjectFilter = getUserObjectFilter(domainId);
 
         final StringBuilder memberOfFilter = new StringBuilder();
         String groupCnName =  _ldapConfiguration.getCommonNameAttribute() + 
"=" +groupName + "," +  _ldapConfiguration.getBaseDn(domainId);
@@ -75,10 +73,18 @@ public class ADLdapUserManagerImpl extends 
OpenLdapUserManagerImpl implements Ld
         result.append(memberOfFilter);
         result.append(")");
 
-        logger.debug("group search filter = " + result);
+        logger.debug("group search filter = {}", result);
         return result.toString();
     }
 
+    StringBuilder getUserObjectFilter(Long domainId) {
+        final StringBuilder userObjectFilter = new StringBuilder();
+        userObjectFilter.append("(&(objectCategory=person)");
+        userObjectFilter.append(super.getUserObjectFilter(domainId));
+        userObjectFilter.append(")");
+        return userObjectFilter;
+    }
+
     protected boolean isUserDisabled(SearchResult result) throws 
NamingException {
         boolean isDisabledUser = false;
         String userAccountControl = 
LdapUtils.getAttributeValue(result.getAttributes(), 
_ldapConfiguration.getUserAccountControlAttribute());
diff --git 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/OpenLdapUserManagerImpl.java
 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/OpenLdapUserManagerImpl.java
index d0b6bc4bd34..80d394d7478 100644
--- 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/OpenLdapUserManagerImpl.java
+++ 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/OpenLdapUserManagerImpl.java
@@ -75,23 +75,15 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
     }
 
     private String generateSearchFilter(final String username, Long domainId) {
-        final StringBuilder userObjectFilter = new StringBuilder();
-        userObjectFilter.append("(objectClass=");
-        userObjectFilter.append(_ldapConfiguration.getUserObject(domainId));
-        userObjectFilter.append(")");
+        final StringBuilder userObjectFilter = getUserObjectFilter(domainId);
 
-        final StringBuilder usernameFilter = new StringBuilder();
-        usernameFilter.append("(");
-        
usernameFilter.append(_ldapConfiguration.getUsernameAttribute(domainId));
-        usernameFilter.append("=");
-        usernameFilter.append((username == null ? "*" : 
LdapUtils.escapeLDAPSearchFilter(username)));
-        usernameFilter.append(")");
+        final StringBuilder usernameFilter = getUsernameFilter(username, 
domainId);
 
         String memberOfAttribute = getMemberOfAttribute(domainId);
         StringBuilder ldapGroupsFilter = new StringBuilder();
         // this should get the trustmaps for this domain
         List<String> ldapGroups = getMappedLdapGroups(domainId);
-        if (null != ldapGroups && ldapGroups.size() > 0) {
+        if (!ldapGroups.isEmpty()) {
             ldapGroupsFilter.append("(|");
             for (String ldapGroup : ldapGroups) {
                 ldapGroupsFilter.append(getMemberOfGroupString(ldapGroup, 
memberOfAttribute));
@@ -104,21 +96,35 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
         if (null != pricipleGroup) {
             principleGroupFilter.append(getMemberOfGroupString(pricipleGroup, 
memberOfAttribute));
         }
-        final StringBuilder result = new StringBuilder();
-        result.append("(&");
-        result.append(userObjectFilter);
-        result.append(usernameFilter);
-        result.append(ldapGroupsFilter);
-        result.append(principleGroupFilter);
-        result.append(")");
-
-        String returnString = result.toString();
-        if (logger.isTraceEnabled()) {
-            logger.trace("constructed ldap query: " + returnString);
-        }
+
+        String returnString = "(&" +
+                userObjectFilter +
+                usernameFilter +
+                ldapGroupsFilter +
+                principleGroupFilter +
+                ")";
+        logger.trace("constructed ldap query: {}", returnString);
         return returnString;
     }
 
+    private StringBuilder getUsernameFilter(String username, Long domainId) {
+        final StringBuilder usernameFilter = new StringBuilder();
+        usernameFilter.append("(");
+        
usernameFilter.append(_ldapConfiguration.getUsernameAttribute(domainId));
+        usernameFilter.append("=");
+        usernameFilter.append((username == null ? "*" : 
LdapUtils.escapeLDAPSearchFilter(username)));
+        usernameFilter.append(")");
+        return usernameFilter;
+    }
+
+    StringBuilder getUserObjectFilter(Long domainId) {
+        final StringBuilder userObjectFilter = new StringBuilder();
+        userObjectFilter.append("(objectClass=");
+        userObjectFilter.append(_ldapConfiguration.getUserObject(domainId));
+        userObjectFilter.append(")");
+        return userObjectFilter;
+    }
+
     private List<String> getMappedLdapGroups(Long domainId) {
         List <String> ldapGroups = new ArrayList<>();
         // first get the trustmaps
@@ -134,37 +140,31 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
     private String getMemberOfGroupString(String group, String 
memberOfAttribute) {
         final StringBuilder memberOfFilter = new StringBuilder();
         if (null != group) {
-            if(logger.isDebugEnabled()) {
-                logger.debug("adding search filter for '" + group +
-                "', using '" + memberOfAttribute + "'");
-            }
-            memberOfFilter.append("(" + memberOfAttribute + "=");
-            memberOfFilter.append(group);
-            memberOfFilter.append(")");
+            logger.debug("adding search filter for '{}', using '{}'", group, 
memberOfAttribute);
+            memberOfFilter.append("(")
+                    .append(memberOfAttribute)
+                    .append("=")
+                    .append(group)
+                    .append(")");
         }
         return memberOfFilter.toString();
     }
 
     private String generateGroupSearchFilter(final String groupName, Long 
domainId) {
-        final StringBuilder groupObjectFilter = new StringBuilder();
-        groupObjectFilter.append("(objectClass=");
-        groupObjectFilter.append(_ldapConfiguration.getGroupObject(domainId));
-        groupObjectFilter.append(")");
-
-        final StringBuilder groupNameFilter = new StringBuilder();
-        groupNameFilter.append("(");
-        groupNameFilter.append(_ldapConfiguration.getCommonNameAttribute());
-        groupNameFilter.append("=");
-        groupNameFilter.append((groupName == null ? "*" : 
LdapUtils.escapeLDAPSearchFilter(groupName)));
-        groupNameFilter.append(")");
-
-        final StringBuilder result = new StringBuilder();
-        result.append("(&");
-        result.append(groupObjectFilter);
-        result.append(groupNameFilter);
-        result.append(")");
-
-        return result.toString();
+        String groupObjectFilter = "(objectClass=" +
+                _ldapConfiguration.getGroupObject(domainId) +
+                ")";
+
+        String groupNameFilter = "(" +
+                _ldapConfiguration.getCommonNameAttribute() +
+                "=" +
+                (groupName == null ? "*" : 
LdapUtils.escapeLDAPSearchFilter(groupName)) +
+                ")";
+
+        return "(&" +
+                groupObjectFilter +
+                groupNameFilter +
+                ")";
     }
 
     @Override
@@ -186,17 +186,9 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
             basedn = _ldapConfiguration.getBaseDn(domainId);
         }
 
-        final StringBuilder userObjectFilter = new StringBuilder();
-        userObjectFilter.append("(objectClass=");
-        userObjectFilter.append(_ldapConfiguration.getUserObject(domainId));
-        userObjectFilter.append(")");
+        final StringBuilder userObjectFilter = getUserObjectFilter(domainId);
 
-        final StringBuilder usernameFilter = new StringBuilder();
-        usernameFilter.append("(");
-        
usernameFilter.append(_ldapConfiguration.getUsernameAttribute(domainId));
-        usernameFilter.append("=");
-        usernameFilter.append((username == null ? "*" : 
LdapUtils.escapeLDAPSearchFilter(username)));
-        usernameFilter.append(")");
+        final StringBuilder usernameFilter = getUsernameFilter(username, 
domainId);
 
         final StringBuilder memberOfFilter = new StringBuilder();
         if ("GROUP".equals(type)) {
@@ -205,18 +197,17 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
             memberOfFilter.append(")");
         }
 
-        final StringBuilder searchQuery = new StringBuilder();
-        searchQuery.append("(&");
-        searchQuery.append(userObjectFilter);
-        searchQuery.append(usernameFilter);
-        searchQuery.append(memberOfFilter);
-        searchQuery.append(")");
+        String searchQuery = "(&" +
+                userObjectFilter +
+                usernameFilter +
+                memberOfFilter +
+                ")";
 
-        return searchUser(basedn, searchQuery.toString(), context, domainId);
+        return searchUser(basedn, searchQuery, context, domainId);
     }
 
     protected String getMemberOfAttribute(final Long domainId) {
-        return _ldapConfiguration.getUserMemberOfAttribute(domainId);
+        return LdapConfiguration.getUserMemberOfAttribute(domainId);
     }
 
     @Override
@@ -243,7 +234,7 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
 
         NamingEnumeration<SearchResult> result = 
context.search(_ldapConfiguration.getBaseDn(domainId), 
generateGroupSearchFilter(groupName, domainId), controls);
 
-        final List<LdapUser> users = new ArrayList<LdapUser>();
+        final List<LdapUser> users = new ArrayList<>();
         //Expecting only one result which has all the users
         if (result.hasMoreElements()) {
             Attribute attribute = 
result.nextElement().getAttributes().get(attributeName);
@@ -254,7 +245,7 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
                 try{
                     users.add(getUserForDn(userdn, context, domainId));
                 } catch (NamingException e){
-                    logger.info("Userdn: " + userdn + " Not Found:: Exception 
message: " + e.getMessage());
+                    logger.info("Userdn: {} Not Found:: Exception message: 
{}", userdn, e.getMessage());
                 }
             }
         }
@@ -286,17 +277,15 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
         return false;
     }
 
-    public LdapUser searchUser(final String basedn, final String searchString, 
final LdapContext context, Long domainId) throws NamingException, IOException {
+    public LdapUser searchUser(final String basedn, final String searchString, 
final LdapContext context, Long domainId) throws NamingException {
         final SearchControls searchControls = new SearchControls();
 
         searchControls.setSearchScope(_ldapConfiguration.getScope());
         
searchControls.setReturningAttributes(_ldapConfiguration.getReturnAttributes(domainId));
 
         NamingEnumeration<SearchResult> results = context.search(basedn, 
searchString, searchControls);
-        if(logger.isDebugEnabled()) {
-            logger.debug("searching user(s) with filter: \"" + searchString + 
"\"");
-        }
-        final List<LdapUser> users = new ArrayList<LdapUser>();
+        logger.debug("searching user(s) with filter: \"{}\"", searchString);
+        final List<LdapUser> users = new ArrayList<>();
         while (results.hasMoreElements()) {
             final SearchResult result = results.nextElement();
                 users.add(createUser(result, domainId));
@@ -324,7 +313,7 @@ public class OpenLdapUserManagerImpl implements 
LdapUserManager {
         byte[] cookie = null;
         int pageSize = _ldapConfiguration.getLdapPageSize(domainId);
         context.setRequestControls(new Control[]{new 
PagedResultsControl(pageSize, Control.NONCRITICAL)});
-        final List<LdapUser> users = new ArrayList<LdapUser>();
+        final List<LdapUser> users = new ArrayList<>();
         NamingEnumeration<SearchResult> results;
         do {
             results = context.search(basedn, generateSearchFilter(username, 
domainId), searchControls);
diff --git 
a/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
 
b/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
index 58b14ec3684..f2ac1dffaf9 100644
--- 
a/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
+++ 
b/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
@@ -54,9 +54,8 @@ public class ADLdapUserManagerImplTest {
         String [] groups = {"dev", "dev-hyd"};
         for (String group: groups) {
             String result = 
adLdapUserManager.generateADGroupSearchFilter(group, 1L);
-            
assertTrue(("(&(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=" + 
group + ",DC=cloud,DC=citrix,DC=com))").equals(result));
+            
assertTrue(("(&(&(objectCategory=person)(objectClass=user))(memberOf:1.2.840.113556.1.4.1941:=CN="
 + group + ",DC=cloud,DC=citrix,DC=com))").equals(result));
         }
-
     }
 
     @Test
@@ -69,7 +68,7 @@ public class ADLdapUserManagerImplTest {
         String [] groups = {"dev", "dev-hyd"};
         for (String group: groups) {
             String result = 
adLdapUserManager.generateADGroupSearchFilter(group, 1L);
-            assertTrue(("(&(objectClass=user)(memberOf=CN=" + group + 
",DC=cloud,DC=citrix,DC=com))").equals(result));
+            
assertTrue(("(&(&(objectCategory=person)(objectClass=user))(memberOf=CN=" + 
group + ",DC=cloud,DC=citrix,DC=com))").equals(result));
         }
     }
 

Reply via email to