gecko-dev/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.java

356 строки
13 KiB
Java

/* -*- 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.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
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.beans.*;
import java.awt.event.*;
/**
* Invisible Bean that just takes a name and password, host and
* port, and directory base and attribute name, and returns an
* attribute's values from a Directory Server. The values are
* assumed to be strings, and are returned as an array. The
* search has the scope "SUB", which means that it will find
* an entry anywhere at or below the directory base.
* <BR><BR>
* Optionally, a client can register as a PropertyChangeListener
* and will be notified when the values are available.
*<BR><BR>
* A null result means the property fetch failed. The reason is
* available through getErrorCode(), which returns one of
* the following:
*<PRE>
* OK
* INVALID_PARAMETER
* CONNECT_ERROR
* AUTHENTICATION_ERROR
* PROPERTY_NOT_FOUND
* AMBIGUOUS_RESULTS
*</PRE>
*/
public class LDAPGetProperty extends LDAPBasePropertySupport implements
Serializable {
/**
* Constructor with no parameters
*/
public LDAPGetProperty() {}
/**
* Constructor with host, port, and base initializers
* @param theHost host string
* @param thePort port number
* @param theBase directory base string
*/
public LDAPGetProperty( String theHost, int thePort, String theBase ) {
setHost( theHost );
setPort( thePort );
setBase( theBase );
}
/**
* 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;
}
private String convertToStrings( String[] aResult ) {
String sResult = "";
if ( null != aResult ) {
for ( int i = 0; i < aResult.length; i++ ) {
sResult += aResult[i] + "\n";
}
}
return sResult;
}
private void notifyResult( String[] newResult ) {
String sNewResult = convertToStrings( newResult );
firePropertyChange( "result", result, newResult );
// firePropertyChange( "resultString", _sResult, sNewResult );
_sResult = sNewResult;
result = newResult;
}
private void notifyResult( Vector newResult ) {
firePropertyChange( "result", resultV, newResult );
resultV = (Vector)newResult.clone();
}
private void notifyResult( String error ) {
firePropertyChange( "error", _errorMsg, error );
_errorMsg = error;
}
public void setDNs(PropertyChangeEvent evt) {
Object obj = (Object)evt.getNewValue();
if ((obj != null) && (obj instanceof String[])) {
String[] strings = (String[])obj;
if (strings.length == 0)
return;
_dns = new String[strings.length];
System.arraycopy(obj, 0, _dns, 0, strings.length);
System.out.println("length of dns -> "+_dns.length);
}
}
/**
* Searches and returns values for a specified attribute
* @param host host string
* @param port port number
* @param base directory base string
* @param filter search filter
* @param attribute name of property to return values for
* @return Array of values for the property
*/
public String[] getProperty( String host, int port, String base,
String filter, String attribute) {
setHost( host );
setPort( port );
setBase( base );
setFilter( filter );
setAttribute( attribute );
return getProperty();
}
// Added this method in order to get exposed in BDK
public void getProperty(ActionEvent x) {
getProperty();
}
/**
* Searches and returns values of a previously registered property,
* using previously set parameters
* @return Array of values for the property
*/
public String[] getProperty() {
if ( (attribute.length() < 1) || (getFilter().length() < 1) ) {
printDebug( "Invalid attribute name or filter" );
setErrorCode( INVALID_PARAMETER );
notifyResult( (String[])null );
return null;
}
String[] res = null;
LDAPConnection m_ldc;
try {
m_ldc = new LDAPConnection();
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 );
return null;
}
// Authenticate?
if (_dns != null) {
for (int i=0; i<_dns.length; i++) {
try {
m_ldc.authenticate(_dns[i], getAuthPassword());
break;
} catch (Exception e) {
if (i == _dns.length-1) {
printDebug( "Failed to authenticate to " +
getHost() + ": " + e.toString() );
setErrorCode( AUTHENTICATION_ERROR );
notifyResult( (String[])null );
return null;
}
}
}
} else if ( (!getAuthDN().equals("")) && (!getAuthPassword().equals("")) ) {
printDebug( "Authenticating " + getAuthDN() + " - " +
getAuthPassword() );
try {
m_ldc.authenticate( getAuthDN(), getAuthPassword() );
} catch (Exception e) {
printDebug( "Failed to authenticate to " +
getHost() + ": " + e.toString() );
setErrorCode( AUTHENTICATION_ERROR );
notifyResult( (String[])null );
return null;
}
}
int numDataEntries = 0;
// Search
try {
String[] attrs = new String[1];
attrs[0] = attribute;
LDAPSearchResults results = m_ldc.search(getBase(),
getScope(),
getFilter(),
attrs, false);
// Should be only one result, at most
LDAPEntry currEntry = null;
LDAPEntry entry = null;
while ( results.hasMoreElements() ) {
try {
currEntry = results.next();
if (numDataEntries == 0)
entry = currEntry;
if (++numDataEntries > 1) {
printDebug( "More than one entry found for " +
getFilter() );
setErrorCode( AMBIGUOUS_RESULTS );
break;
}
} catch (LDAPReferralException e) {
if (getDebug()) {
notifyResult("Referral URLs: ");
LDAPUrl refUrls[] = e.getURLs();
for (int i = 0; i < refUrls.length; i++)
notifyResult(refUrls[i].getUrl());
}
continue;
} catch (LDAPException e) {
if (getDebug())
notifyResult(e.toString());
continue;
}
}
if (numDataEntries == 1) {
printDebug( "... " + entry.getDN() );
// Good - exactly one entry found; get the attribute
// Treat DN as a special case
if ( attribute.equalsIgnoreCase( "dn" ) ) {
res = new String[1];
res[0] = entry.getDN();
setErrorCode( OK );
} else {
LDAPAttributeSet attrset = entry.getAttributeSet();
Enumeration attrsenum = attrset.getAttributes();
if (attrsenum.hasMoreElements()) {
LDAPAttribute attr =
(LDAPAttribute)attrsenum.nextElement();
printDebug( attr.getName() + " = " );
// Get the values as strings
Enumeration valuesenum = attr.getStringValues();
if (valuesenum != null) {
// Create a string array for the results
Vector v = new Vector();
while (valuesenum.hasMoreElements()) {
String val = (String)valuesenum.nextElement();
v.addElement( val );
printDebug( "\t\t" + val );
}
res = new String[v.size()];
for( int i = 0; i < v.size(); i++ )
res[i] = (String)v.elementAt( i );
setErrorCode( OK );
} else {
Enumeration byteEnum = attr.getByteValues();
Vector v = new Vector();
while (byteEnum.hasMoreElements()) {
byte[] val = (byte[])byteEnum.nextElement();
v.addElement( val );
printDebug( "\t\t" + val );
}
setErrorCode( OK );
notifyResult(v);
return (res = null);
}
} else {
printDebug( "No properties found for " +
attribute );
setErrorCode( PROPERTY_NOT_FOUND );
}
}
}
} catch (Exception e) {
printDebug( "Failed to search for " + getFilter() + ": "
+ e.toString() );
setErrorCode( PROPERTY_NOT_FOUND );
}
if (numDataEntries == 0) {
printDebug( "No entries found for " + getFilter() );
setErrorCode( PROPERTY_NOT_FOUND );
}
try {
if ( (m_ldc != null) && m_ldc.isConnected() )
m_ldc.disconnect();
} catch ( Exception e ) {
}
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[]) {
if (args.length != 5) {
System.out.println( "Usage: LDAPGetProperty host port base" +
" filter attribute" );
System.exit(1);
}
LDAPGetProperty app = new LDAPGetProperty();
app.setHost( args[0] );
app.setPort( java.lang.Integer.parseInt( args[1] ) );
app.setBase( args[2] );
app.setFilter( args[3] );
app.setAttribute( args[4] );
String[] response = app.getProperty();
if ( response != null ) {
for( int i = 0; i < response.length; i++ )
System.out.println( "\t" + response[i] );
}
System.exit(0);
}
/*
* Variables
*/
public static final int OK = 0;
public static final int INVALID_PARAMETER = 1;
public static final int CONNECT_ERROR = 2;
public static final int AUTHENTICATION_ERROR = 3;
public static final int PROPERTY_NOT_FOUND = 4;
public static final int AMBIGUOUS_RESULTS = 5;
private String[] _dns = null;
private String attribute = new String("cn");
transient private String[] result;
private Vector resultV = null;
private String _sResult = null;
private String _errorMsg = null;
}