blob: c9884a8c7764dde8664c2faa41efb4892440d8c1 [file] [log] [blame]
/*
* 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.ldapbrowser.core.jobs;
import org.apache.directory.studio.connection.core.ConnectionServerType;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IRootDSE;
/**
* Utility class for detecting the type of server based on its Root DSE.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class ServerTypeDetector
{
/**
* Detects the type of server we are talking to. We can detect the following servers :
* <ul>
* <li>ApacheDS</li>
* <li>IBM IDS</li>
* <li>Netscape</li>
* <li>Novell</li>
* <li>SUN DS</li>
* <li>Microsoft Active Directory</li>
* <li>OpenLDAP</li>
* <li>Siemens</li>
* <li>RedHat 389</li>
* </ul>
*
* NOTE : We should add detectors for RedHAT i389 and Forgerock OpenDJ
*
* @param rootDSE the Root DSE
* @return the corresponding server type or 'UNKNOWN'
*/
public static ConnectionServerType detectServerType( IRootDSE rootDSE )
{
ConnectionServerType serverType;
IAttribute vnAttribute = rootDSE.getAttribute( "vendorName" ); //$NON-NLS-1$
IAttribute vvAttribute = rootDSE.getAttribute( "vendorVersion" ); //$NON-NLS-1$
if ( vnAttribute != null && vnAttribute.getStringValues().length > 0 && vvAttribute != null
&& vvAttribute.getStringValues().length > 0 )
{
String vendorName = vnAttribute.getStringValues()[0];
String vendorVersion = vvAttribute.getStringValues()[0];
// ApacheDS
serverType = detectApacheDS( vendorName );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// IBM
serverType = detectIbm( vendorName, vendorVersion );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// Netscape
serverType = detectNetscape( vendorName, vendorVersion );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// Novell
serverType = detectNovell( vendorName, vendorVersion );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// Sun
serverType = detectSun( vendorName, vendorVersion );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// RedHat 389
serverType = detectRedHat389( vendorName, vendorVersion );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// FrgeRock OpenDJ
serverType = detectOpenDJ( vendorName, vendorVersion );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
}
// Microsoft
serverType = detectMicrosoft( rootDSE );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// OpenLDAP
serverType = detectOpenLdap( rootDSE );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
// Siemens
serverType = detectSiemens( rootDSE );
if ( !ConnectionServerType.UNKNOWN.equals( serverType ) )
{
return serverType;
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects ApacheDS.
*
* @param vendorName the vendor name
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectApacheDS( String vendorName )
{
if ( vendorName.indexOf( "Apache Software Foundation" ) > -1 ) //$NON-NLS-1$
{
return ConnectionServerType.APACHEDS;
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects the following IBM directory servers:
* <ul>
* <li>IBM Directory Server</li>
* <li>IBM Secureway Directory</li>
* <li>IBM Tivoli Directory Server</li>
* </ul>
*
* @param vendorName the vendor name
* @param vendorVersion the vendor version
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectIbm( String vendorName, String vendorVersion )
{
// IBM
if ( vendorName.indexOf( "International Business Machines" ) > -1 ) //$NON-NLS-1$
{
// IBM SecureWay Directory
String[] iswVersions = { "3.2", "3.2.1", "3.2.2" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
for ( String version : iswVersions )
{
if ( vendorVersion.indexOf( version ) > -1 )
{
return ConnectionServerType.IBM_SECUREWAY_DIRECTORY;
}
}
// IBM Directory Server
String[] idsVersions = { "4.1", "5.1" }; //$NON-NLS-1$ //$NON-NLS-2$
for ( String version : idsVersions )
{
if ( vendorVersion.indexOf( version ) > -1 )
{
return ConnectionServerType.IBM_DIRECTORY_SERVER;
}
}
// IBM Tivoli Directory Server
String[] tdsVersions = { "5.2", "6.0", "6.1", "6.2" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
for ( String version : tdsVersions )
{
if ( vendorVersion.indexOf( version ) > -1 )
{
return ConnectionServerType.IBM_TIVOLI_DIRECTORY_SERVER;
}
}
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects the following Microsoft directory servers:
* <ul>
* <li>Microsoft Active Directory 2000</li>
* <li>Microsoft Active Directory 2003</li>
* </ul>
*
* @param rootDSE the Root DSE
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectMicrosoft( IRootDSE rootDSE )
{
if ( rootDSE.getAttribute( "rootDomainNamingContext" ) != null )
{
if ( rootDSE.getAttribute( "forestFunctionality" ) != null )
{
return ConnectionServerType.MICROSOFT_ACTIVE_DIRECTORY_2003;
}
else
{
return ConnectionServerType.MICROSOFT_ACTIVE_DIRECTORY_2000;
}
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects Netscape directory server.
*
* @param vendorName the vendor name
* @param vendorVersion the vendor version
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectNetscape( String vendorName, String vendorVersion )
{
if ( vendorName.indexOf( "Netscape" ) > -1 //$NON-NLS-1$
|| vendorVersion.indexOf( "Netscape" ) > -1 ) //$NON-NLS-1$
{
return ConnectionServerType.NETSCAPE;
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects Novell directory server.
*
* @param vendorName the vendor name
* @param vendorVersion the vendor version
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectNovell( String vendorName, String vendorVersion )
{
if ( vendorName.indexOf( "Novell" ) > -1 //$NON-NLS-1$
|| vendorVersion.indexOf( "eDirectory" ) > -1 ) //$NON-NLS-1$
{
return ConnectionServerType.NOVELL;
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects the following OpenLDAP directory servers:
* <ul>
* <li>OpenLDAP 2.4</li>
* <li>OpenLDAP 2.3</li>
* <li>OpenLDAP 2.2</li>
* <li>OpenLDAP 2.1</li>
* <li>OpenLDAP 2.0</li>
* <li>OpenLDAP</li>
* </ul>
*
* @param rootDSE the Root DSE
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectOpenLdap( IRootDSE rootDSE )
{
IAttribute ocAttribute = rootDSE.getAttribute( "objectClass" ); //$NON-NLS-1$
if ( ocAttribute != null )
{
for ( int i = 0; i < ocAttribute.getStringValues().length; i++ )
{
if ( "OpenLDAProotDSE".equals( ocAttribute.getStringValues()[i] ) ) //$NON-NLS-1$
{
IAttribute scAttribute = rootDSE.getAttribute( "supportedControl" ); //$NON-NLS-1$
// Check for the new "Don't Use Copy" Control (RFC 6171) that has been added in OpenLDAP 2.4
if ( scAttribute != null )
{
for ( int sci = 0; sci < scAttribute.getStringValues().length; sci++ )
{
if ( "1.3.6.1.1.22".equals( scAttribute.getStringValues()[sci] ) ) //$NON-NLS-1$
{
return ConnectionServerType.OPENLDAP_2_4;
}
}
}
// ConfigContext has been added in OpenLDAP 2.3
if ( rootDSE.getAttribute( "configContext" ) != null )
{
return ConnectionServerType.OPENLDAP_2_3;
}
// Proxy Auth control has been added in OpenLDAP 2.0
if ( scAttribute != null )
{
for ( int sci = 0; sci < scAttribute.getStringValues().length; sci++ )
{
if ( "2.16.840.1.113730.3.4.18".equals( scAttribute.getStringValues()[sci] ) ) //$NON-NLS-1$
{
return ConnectionServerType.OPENLDAP_2_2;
}
}
}
// Check for the 'Who Am I' extended operation, added in OpenLDAP 2.1
IAttribute seAttribute = rootDSE.getAttribute( "supportedExtension" ); //$NON-NLS-1$
if ( seAttribute != null )
{
for ( int sei = 0; sei < seAttribute.getStringValues().length; sei++ )
{
if ( "1.3.6.1.4.1.4203.1.11.3".equals( seAttribute.getStringValues()[sei] ) ) //$NON-NLS-1$
{
return ConnectionServerType.OPENLDAP_2_1;
}
}
}
// The 'Language Tag' feature has been added in OpenLDAP 2.0
IAttribute sfAttribute = rootDSE.getAttribute( "supportedFeatures" ); //$NON-NLS-1$
if ( sfAttribute != null )
{
for ( int sfi = 0; sfi < sfAttribute.getStringValues().length; sfi++ )
{
if ( "1.3.6.1.4.1.4203.1.5.4".equals( sfAttribute.getStringValues()[sfi] ) ) //$NON-NLS-1$
{
return ConnectionServerType.OPENLDAP_2_0;
}
}
}
return ConnectionServerType.OPENLDAP;
}
}
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects Siemens directory server.
*
* @param rootDSE the Root DSE
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectSiemens( IRootDSE rootDSE )
{
IAttribute ssseAttribute = rootDSE.getAttribute( "subSchemaSubentry" ); //$NON-NLS-1$
if ( ssseAttribute != null )
{
for ( int i = 0; i < ssseAttribute.getStringValues().length; i++ )
{
if ( "cn=LDAPGlobalSchemaSubentry".equals( ssseAttribute.getStringValues()[i] ) ) //$NON-NLS-1$
{
return ConnectionServerType.SIEMENS_DIRX;
}
}
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects Sun directory server.
*
* @param vendorName the vendor name
* @param vendorVersion the vendor version
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectSun( String vendorName, String vendorVersion )
{
if ( vendorName.indexOf( "Sun" ) > -1 //$NON-NLS-1$
|| vendorVersion.indexOf( "Sun" ) > -1 ) //$NON-NLS-1$
{
return ConnectionServerType.SUN_DIRECTORY_SERVER;
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects RedHat 389 directory server.
*
* @param vendorName the vendor name
* @param vendorVersion the vendor version
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectRedHat389( String vendorName, String vendorVersion )
{
if ( vendorName.indexOf( "389 Project" ) > -1 //$NON-NLS-1$
|| vendorVersion.indexOf( "389-Directory" ) > -1 ) //$NON-NLS-1$
{
return ConnectionServerType.RED_HAT_389;
}
return ConnectionServerType.UNKNOWN;
}
/**
* Detects ForgeRock OpenDJ directory server.
*
* @param vendorName the vendor name
* @param vendorVersion the vendor version
* @return the corresponding server type or 'UNKNOWN'
*/
private static ConnectionServerType detectOpenDJ( String vendorName, String vendorVersion )
{
if ( vendorName.indexOf( "ForgeRock" ) > -1 //$NON-NLS-1$
|| vendorVersion.indexOf( "OpenDJ" ) > -1 ) //$NON-NLS-1$
{
return ConnectionServerType.FORGEROCK_OPEN_DJ;
}
return ConnectionServerType.UNKNOWN;
}
}