mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	GUAC-1115: Add LDAP query for retrieving the DNs which correspond to a particular user account.
This commit is contained in:
		| @@ -28,7 +28,9 @@ import com.novell.ldap.LDAPConnection; | |||||||
| import com.novell.ldap.LDAPEntry; | import com.novell.ldap.LDAPEntry; | ||||||
| import com.novell.ldap.LDAPException; | import com.novell.ldap.LDAPException; | ||||||
| import com.novell.ldap.LDAPSearchResults; | import com.novell.ldap.LDAPSearchResults; | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import org.glyptodon.guacamole.auth.ldap.ConfigurationService; | import org.glyptodon.guacamole.auth.ldap.ConfigurationService; | ||||||
| import org.glyptodon.guacamole.auth.ldap.EscapingService; | import org.glyptodon.guacamole.auth.ldap.EscapingService; | ||||||
| @@ -164,4 +166,107 @@ public class UserService { | |||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Generates a properly-escaped LDAP query which finds all objects having | ||||||
|  |      * at least one username attribute set to the specified username, where | ||||||
|  |      * the possible username attributes are defined within | ||||||
|  |      * guacamole.properties. | ||||||
|  |      * | ||||||
|  |      * @param username | ||||||
|  |      *     The username that the resulting LDAP query should search for within | ||||||
|  |      *     objects within the LDAP directory. | ||||||
|  |      * | ||||||
|  |      * @return | ||||||
|  |      *     An LDAP query which will search for arbitrary LDAP objects | ||||||
|  |      *     containing at least one username attribute set to the specified | ||||||
|  |      *     username. | ||||||
|  |      * | ||||||
|  |      * @throws GuacamoleException | ||||||
|  |      *     If the LDAP query cannot be generated because the list of username | ||||||
|  |      *     attributes cannot be parsed from guacamole.properties. | ||||||
|  |      */ | ||||||
|  |     private String generateLDAPQuery(String username) | ||||||
|  |             throws GuacamoleException { | ||||||
|  |  | ||||||
|  |         List<String> usernameAttributes = confService.getUsernameAttributes(); | ||||||
|  |  | ||||||
|  |         // Build LDAP query for users having at least one username attribute | ||||||
|  |         // with the specified username as its value | ||||||
|  |         StringBuilder ldapQuery = new StringBuilder("(&(objectClass=*)"); | ||||||
|  |  | ||||||
|  |         // Include all attributes within OR clause if there are more than one | ||||||
|  |         if (usernameAttributes.size() > 1) | ||||||
|  |             ldapQuery.append("(|"); | ||||||
|  |  | ||||||
|  |         // Add equality comparison for each possible username attribute | ||||||
|  |         for (String usernameAttribute : usernameAttributes) { | ||||||
|  |             ldapQuery.append("("); | ||||||
|  |             ldapQuery.append(escapingService.escapeLDAPSearchFilter(usernameAttribute)); | ||||||
|  |             ldapQuery.append("="); | ||||||
|  |             ldapQuery.append(escapingService.escapeLDAPSearchFilter(username)); | ||||||
|  |             ldapQuery.append(")"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Close OR clause, if any | ||||||
|  |         if (usernameAttributes.size() > 1) | ||||||
|  |             ldapQuery.append(")"); | ||||||
|  |  | ||||||
|  |         return ldapQuery.toString(); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns a list of all DNs corresponding to the users having the given | ||||||
|  |      * username. If multiple username attributes are defined, or if uniqueness | ||||||
|  |      * is not enforced across the username attribute, it is possible that this | ||||||
|  |      * will return multiple DNs. | ||||||
|  |      * | ||||||
|  |      * @param ldapConnection | ||||||
|  |      *     The connection to the LDAP server to use when querying user DNs. | ||||||
|  |      * | ||||||
|  |      * @param username | ||||||
|  |      *     The username of the user whose corresponding user account DNs are | ||||||
|  |      *     to be retrieved. | ||||||
|  |      * | ||||||
|  |      * @return | ||||||
|  |      *     A list of all DNs corresponding to the users having the given | ||||||
|  |      *     username. If no such DNs exist, this list will be empty. | ||||||
|  |      * | ||||||
|  |      * @throws GuacamoleException | ||||||
|  |      *     If an error occurs while querying the user DNs, or if the username | ||||||
|  |      *     attribute property cannot be parsed within guacamole.properties. | ||||||
|  |      */ | ||||||
|  |     public List<String> getUserDNs(LDAPConnection ldapConnection, | ||||||
|  |             String username) throws GuacamoleException { | ||||||
|  |  | ||||||
|  |         try { | ||||||
|  |  | ||||||
|  |             List<String> userDNs = new ArrayList<String>(); | ||||||
|  |  | ||||||
|  |             // Find all Guacamole users underneath base DN and matching the | ||||||
|  |             // specified username | ||||||
|  |             LDAPSearchResults results = ldapConnection.search( | ||||||
|  |                 confService.getUserBaseDN(), | ||||||
|  |                 LDAPConnection.SCOPE_SUB, | ||||||
|  |                 generateLDAPQuery(username), | ||||||
|  |                 null, | ||||||
|  |                 false | ||||||
|  |             ); | ||||||
|  |  | ||||||
|  |             // Add all DNs for found users | ||||||
|  |             while (results.hasMore()) { | ||||||
|  |                 LDAPEntry entry = results.next(); | ||||||
|  |                 userDNs.add(entry.getDN()); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Return all discovered DNs (if any) | ||||||
|  |             return userDNs; | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |         catch (LDAPException e) { | ||||||
|  |             throw new GuacamoleServerException("Error while query user DNs.", e); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user