/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ package netscape.ldap.beans; import netscape.ldap.*; import netscape.ldap.beans.LDAPBasePropertySupport; import java.util.Enumeration; import java.util.Vector; import java.io.Serializable; import java.awt.event.*; /** * Invisible Bean that just takes a host, port, directory base, * search string, and optional authentication name and password, * and returns a list of all matching DNs. The search has the scope * "SUB", which means that it will find an entry anywhere at or * below the directory base, unless a different scope is specified. *

* Optionally, a client can register as a PropertyChangeListener * and will be notified when the values are available. *

* A null result means no matching DNs were found. The reason is * available through getErrorCode(), which returns one of * the following: *
 *     OK
 *     INVALID_PARAMETER
 *     CONNECT_ERROR
 *     AUTHENTICATION_ERROR
 *     PROPERTY_NOT_FOUND
 *     AMBIGUOUS_RESULTS
 *
* */ public class LDAPGetEntries extends LDAPBasePropertySupport implements Serializable { /** * Constructor with no parameters */ public LDAPGetEntries() { super(); } /** * Constructor with host, port, and base initializers * @param theHost host string * @param thePort port number * @param theBase directory base string */ public LDAPGetEntries( String theHost, int thePort, String theBase ) { setHost( theHost ); setPort( thePort ); setBase( theBase ); } /** * Constructor with host, port, base, and scope initializers * @param theHost host string * @param thePort port number * @param theBase directory base string * @param theScope one of LDAPConnection.SCOPE_BASE, * LDAPConnection.SCOPE_SUB, LDAPConnection.SCOPE_ONE */ public LDAPGetEntries( String theHost, int thePort, String theBase, int theScope ) { setHost( theHost ); setPort( thePort ); setBase( theBase ); setScope( theScope ); } private void notifyResult( String error ) { firePropertyChange( "error", _errorMsg, error ); _errorMsg = error; } private void notifyResult( String[] newResult ) { String sNewResult = convertToString( newResult ); firePropertyChange( "result", _result, newResult ); _sResult = sNewResult; _result = newResult; } /** * Returns the name of the attribute to retrieve * @return attribute name to retrieve */ public String getAttribute() { return _attribute; } /** * Sets the attribute to retrieve */ public void setAttribute( String attr ) { _attribute = attr; } public void setResultString( String sNewValue ) { _sResult = sNewValue; } public String getResultString() { return _sResult; } /** * Searches and returns values for a specified attribute * @param host host string * @param port port number * @param base directory base string * @param scope one of LDAPConnection.SCOPE_BASE, * LDAPConnection.SCOPE_SUB, LDAPConnection.SCOPE_ONE * @param filter search filter * @param attribute name of property to return values for * @return Array of values for the property */ public String[] getEntries( String host, int port, String base, int scope, String filter) { setHost( host ); setPort( port ); setBase( base ); setScope( scope ); setFilter( filter ); return getEntries(); } /** * Searches and returns values for a specified attribute * @param host host string * @param port port number * @param base directory base string * @param scope one of LDAPConnection.SCOPE_BASE, * LDAPConnection.SCOPE_SUB, LDAPConnection.SCOPE_ONE * @param userName The user name * @param userid The user id * @return Array of DNs */ public String[] getEntries( String host, int port, String base, int scope, String userid, String userName) { setHost( host ); setPort( port ); setBase( base ); setScope( scope ); if (userName == null) userName = new String(""); setUserName( userName ); if (userid == null) userid = new String(""); setUserID( userid ); return getEntries(); } // Added this method in order to get exposed in BDK public void getEntries(ActionEvent x) { getEntries(); } /** * Searches and returns values of a previously registered property, * using previously set parameters * @return Array of values for the property */ public String[] getEntries() { boolean invalid = false; if ((getUserName().length() < 1) && (getUserID().length() < 1) && (getFilter().length() < 1)) { printDebug("No user name or user ID"); invalid = true; } else if ( (getHost().length() < 1) || (getBase().length() < 1) ) { printDebug( "Invalid host name or search base" ); invalid = true; } if ( invalid ) { setErrorCode( INVALID_PARAMETER ); notifyResult( (String)null); return null; } if (getFilter().length() < 1) { String filter = new String(""); if ((getUserName().length() > 1) && (getUserID().length() > 1)) { filter = "(|(cn="+getUserName()+")(uid="+getUserID()+"))"; } else if (getUserName().length() > 1) { filter = "cn="+getUserName(); } else if (getUserID().length() > 1) { filter = "uid="+getUserID(); } setFilter(filter); } String[] res = null; LDAPConnection m_ldc = new LDAPConnection(); try { try { printDebug("Connecting to " + getHost() + " " + getPort()); connect( m_ldc, getHost(), getPort()); } catch (Exception e) { printDebug( "Failed to connect to " + getHost() + ": " + e.toString() ); setErrorCode( CONNECT_ERROR ); notifyResult( (String)null ); m_ldc = null; throw( new Exception() ); } // Authenticate? if ( (!getAuthDN().equals("")) && (!getAuthPassword().equals("")) ) { printDebug( "Authenticating " + getAuthDN() ); try { m_ldc.authenticate( getAuthDN(), getAuthPassword() ); } catch (Exception e) { printDebug( "Failed to authenticate: " + e.toString() ); setErrorCode( AUTHENTICATION_ERROR ); notifyResult( (String)null ); throw( new Exception() ); } } // Search try { printDebug("Searching " + getBase() + " for " + getFilter() + ", scope = " + getScope()); String[] attrs = { _attribute }; LDAPSearchResults results = m_ldc.search( getBase(), getScope(), getFilter(), attrs, false); // Create a vector for the results Vector v = new Vector(); LDAPEntry entry = null; while ( results.hasMoreElements() ) { try { entry = results.next(); } catch (LDAPException e) { if (getDebug()) notifyResult(e.toString()); continue; } // Add the DN to the list String value = ""; if ( _attribute.equals("dn") ) { value = entry.getDN(); } else { LDAPAttribute attr = entry.getAttribute( _attribute ); if ( attr != null ) { Enumeration vals = attr.getStringValues(); if ( (vals != null) && (vals.hasMoreElements()) ) { value = (String)vals.nextElement(); } } } v.addElement( value ); printDebug( "... " + value ); } // Pull out the DNs and create a string array if ( v.size() > 0 ) { res = new String[v.size()]; v.copyInto( res ); v.removeAllElements(); setErrorCode( OK ); } else { printDebug( "No entries found for " + getFilter() ); setErrorCode( PROPERTY_NOT_FOUND ); } } catch (Exception e) { if (getDebug()) { printDebug( "Failed to search for " + getFilter() + ": " + e.toString() ); } setErrorCode( PROPERTY_NOT_FOUND ); } } catch (Exception e) { } // Disconnect try { if ( (m_ldc != null) && m_ldc.isConnected() ) m_ldc.disconnect(); } catch ( Exception e ) { } // Notify any clients with a PropertyChangeEvent notifyResult( res ); return res; } /** * The main body if we run it as application instead of applet. * @param args list of arguments */ public static void main(String args[]) { String[] scope = { "base", "one", "sub" }; int scopeIndex = -1; for( int i = 0; (i < scope.length) && (args.length == 5); i++ ) { if ( args[3].equalsIgnoreCase(scope[i]) ) { scopeIndex = i; break; } } if ( scopeIndex < 0 ) { System.out.println( "Usage: LDAPGetEntries host port base" + " scope filter" ); System.exit(1); } LDAPGetEntries app = new LDAPGetEntries(); app.setHost( args[0] ); app.setPort( java.lang.Integer.parseInt( args[1] ) ); app.setBase( args[2] ); app.setScope( scopeIndex ); app.setFilter( args[4] ); String[] response = app.getEntries(); if ( response != null ) { for( int i = 0; i < response.length; i++ ) System.out.println( "\t" + response[i] ); } System.exit(0); } /* * Variables */ private String _attribute = "dn"; private String[] _result; private String _sResult = null; private String _errorMsg = null; }