/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.studio.connection.core;
import java.util.Arrays;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.naming.directory.SearchControls;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.ldap.model.url.LdapUrl;
import org.apache.directory.api.util.Strings;
import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
import org.apache.directory.studio.connection.core.ConnectionParameter.EncryptionMethod;
/**
* Some utils.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class Utils
{
private static final String DOT_DOT_DOT = "..."; //$NON-NLS-1$
public static ResourceBundle oidDescriptions = null;
// Load RessourceBundle with OID descriptions
static
{
try
{
oidDescriptions = ResourceBundle.getBundle( "org.apache.directory.studio.connection.core.OIDDescriptions" ); //$NON-NLS-1$
}
catch ( Exception e )
{
e.printStackTrace();
}
}
public static ResourceBundle resultCodeDescriptions = null;
// Load RessourceBundle with OID descriptions
static
{
try
{
resultCodeDescriptions = ResourceBundle
.getBundle( "org.apache.directory.studio.connection.core.ResultCodeDescriptions" ); //$NON-NLS-1$
}
catch ( Exception e )
{
e.printStackTrace();
}
}
/**
* Gets the textual OID description for the given numeric OID.
*
* @param oid the numeric OID
*
* @return the OID description, null if the numeric OID is unknown
*/
public static String getOidDescription( String oid )
{
if ( oidDescriptions != null )
{
try
{
return oidDescriptions.getString( oid );
}
catch ( MissingResourceException ignored )
{
}
}
return null;
}
/**
* Gets the textual result code description for the given numeric result code.
*
* @param code the result code
*
* @return the OID description, null if the numeric OID is unknown
*/
public static String getResultCodeDescription( int code )
{
if ( resultCodeDescriptions != null )
{
try
{
return resultCodeDescriptions.getString( "" + code ); //$NON-NLS-1$
}
catch ( MissingResourceException ignored )
{
}
}
return null;
}
/**
* Shortens the given label to the given maximum length
* and filters non-printable characters.
*
* @param label the label
* @param maxLength the max length
*
* @return the shortened label
*/
public static String shorten( String label, int maxLength )
{
if ( label == null )
{
return null;
}
// shorten label
if ( maxLength < 3 )
{
return DOT_DOT_DOT;
}
if ( label.length() > maxLength )
{
label = label.substring( 0, maxLength / 2 ) + DOT_DOT_DOT
+ label.substring( label.length() - maxLength / 2, label.length() );
}
// filter non-printable characters
StringBuffer sb = new StringBuffer( maxLength + 3 );
for ( int i = 0; i < label.length(); i++ )
{
char c = label.charAt( i );
if ( Character.isISOControl( c ) )
{
sb.append( '.' );
}
else
{
sb.append( c );
}
}
return sb.toString();
}
/**
* Converts a String into a String that could be used as a filename.
*
* @param s
* the String to convert
* @return
* the converted String
*/
public static String getFilenameString( String s )
{
if ( s == null )
{
return null;
}
byte[] b = Strings.getBytesUtf8( s );
StringBuffer sb = new StringBuffer();
for ( int i = 0; i < b.length; i++ )
{
if ( b[i] == '-' || b[i] == '_' || ( '0' <= b[i] && b[i] <= '9' ) || ( 'A' <= b[i] && b[i] <= 'Z' )
|| ( 'a' <= b[i] && b[i] <= 'z' ) )
{
sb.append( ( char ) b[i] );
}
else
{
int x = ( int ) b[i];
if ( x < 0 )
x = 256 + x;
String t = Integer.toHexString( x );
if ( t.length() == 1 )
t = '0' + t; //$NON-NLS-1$
sb.append( t );
}
}
return sb.toString();
}
/**
* Transforms the given search parameters into an LDAP URL.
*
* @param connection the connection
* @param searchBase the search base
* @param scope the search scope
* @param filter the search filter
* @param attributes the returning attributes
*
* @return the LDAP URL for the given search parameters
*/
public static LdapUrl getLdapURL( Connection connection, String searchBase, int scope, String filter,
String[] attributes )
{
LdapUrl url = new LdapUrl();
url.setScheme( connection.getEncryptionMethod() == EncryptionMethod.LDAPS ? LdapUrl.LDAPS_SCHEME
: LdapUrl.LDAP_SCHEME );
url.setHost( connection.getHost() );
url.setPort( connection.getPort() );
try
{
url.setDn( new Dn( searchBase ) );
}
catch ( LdapInvalidDnException e )
{
}
if ( attributes != null )
{
url.setAttributes( Arrays.asList( attributes ) );
}
url.setScope( scope );
url.setFilter( filter );
return url;
}
/**
* Gets the simple normalized form of the LDAP URL: schema, host and port.
*
* @param url the LDAP URL
*
* @return the simple normalized form of the LDAP URL
*/
public static String getSimpleNormalizedUrl( LdapUrl url )
{
return url.getScheme()
+ ( url.getHost() != null ? Strings.toLowerCase( url.getHost() ) : "" ) + ":" + url.getPort(); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Transforms the given search parameters into an ldapsearch command line.
*
* @param connection the connection
* @param searchBase the search base
* @param scope the search scope
* @param aliasesDereferencingMethod the aliases dereferencing method
* @param sizeLimit the size limit
* @param timeLimit the time limit
* @param filter the search filter
* @param attributes the returning attributes
*
* @return the ldapsearch command line for the given search parameters
*/
public static String getLdapSearchCommandLine( Connection connection, String searchBase, int scope,
AliasDereferencingMethod aliasesDereferencingMethod, long sizeLimit, long timeLimit, String filter,
String[] attributes )
{
StringBuilder cmdLine = new StringBuilder();
cmdLine.append( "ldapsearch" ); //$NON-NLS-1$
cmdLine.append( " -H " ).append( //$NON-NLS-1$
connection.getEncryptionMethod() == EncryptionMethod.LDAPS ? LdapUrl.LDAPS_SCHEME : LdapUrl.LDAP_SCHEME )
.append( connection.getHost() ).append( ":" ).append( connection.getPort() ); //$NON-NLS-1$
if ( connection.getEncryptionMethod() == EncryptionMethod.START_TLS )
{
cmdLine.append( " -ZZ" ); //$NON-NLS-1$
}
switch ( connection.getAuthMethod() )
{
case SIMPLE:
cmdLine.append( " -x" ); //$NON-NLS-1$
cmdLine.append( " -D \"" ).append( connection.getBindPrincipal() ).append( "\"" ); //$NON-NLS-1$ //$NON-NLS-2$
cmdLine.append( " -W" ); //$NON-NLS-1$
break;
case SASL_CRAM_MD5:
cmdLine.append( " -U \"" ).append( connection.getBindPrincipal() ).append( "\"" ); //$NON-NLS-1$ //$NON-NLS-2$
cmdLine.append( " -Y \"CRAM-MD5\"" ); //$NON-NLS-1$
break;
case SASL_DIGEST_MD5:
cmdLine.append( " -U \"" ).append( connection.getBindPrincipal() ).append( "\"" ); //$NON-NLS-1$ //$NON-NLS-2$
cmdLine.append( " -Y \"DIGEST-MD5\"" ); //$NON-NLS-1$
break;
case SASL_GSSAPI:
cmdLine.append( " -Y \"GSSAPI\"" ); //$NON-NLS-1$
break;
}
cmdLine.append( " -b \"" ).append( searchBase ).append( "\"" ); //$NON-NLS-1$ //$NON-NLS-2$
String scopeAsString = scope == SearchControls.SUBTREE_SCOPE ? "sub" //$NON-NLS-1$
: scope == SearchControls.ONELEVEL_SCOPE ? "one" : "base"; //$NON-NLS-1$ //$NON-NLS-2$
cmdLine.append( " -s " ).append( scopeAsString ); //$NON-NLS-1$
if ( aliasesDereferencingMethod != AliasDereferencingMethod.NEVER )
{
String aliasAsString = aliasesDereferencingMethod == AliasDereferencingMethod.ALWAYS ? "always" //$NON-NLS-1$
: aliasesDereferencingMethod == AliasDereferencingMethod.FINDING ? "find" //$NON-NLS-1$
: aliasesDereferencingMethod == AliasDereferencingMethod.SEARCH ? "search" : "never"; //$NON-NLS-1$ //$NON-NLS-2$
cmdLine.append( " -a " ).append( aliasAsString ); //$NON-NLS-1$
}
if ( sizeLimit > 0 )
{
cmdLine.append( " -z " ).append( sizeLimit ); //$NON-NLS-1$
}
if ( timeLimit > 0 )
{
cmdLine.append( " -l " ).append( timeLimit ); //$NON-NLS-1$
}
cmdLine.append( " \"" ).append( filter ).append( "\"" ); //$NON-NLS-1$ //$NON-NLS-2$
if ( attributes != null )
{
if ( attributes.length == 0 )
{
cmdLine.append( " \"1.1\"" ); //$NON-NLS-1$
}
for ( String attribute : attributes )
{
cmdLine.append( " \"" ).append( attribute ).append( "\"" ); //$NON-NLS-1$ //$NON-NLS-2$
}
}
return cmdLine.toString();
}
/**
* Gets the LdapDN from the given String or null if the
* String can't be parsed.
*
* @param dn the Dn as String
*
* @return the Dn as LdapDN
*/
public static Dn getLdapDn( String dn )
{
if ( dn == null )
{
return null;
}
try
{
return new Dn( dn );
}
catch ( LdapInvalidDnException e )
{
return null;
}
}
}