/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2008 Sun Microsystems Inc. All Rights Reserved
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* https://opensso.dev.java.net/public/CDDLv1.0.html or
* opensso/legal/CDDLv1.0.txt
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at opensso/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id: DirectoryServerVendor.java,v 1.3 2009/01/28 05:35:03 ww203982 Exp $
*
* Portions Copyrighted 2010-2016 ForgeRock AS.
*/
package com.sun.identity.sm;
import org.forgerock.openam.ldap.LDAPRequests;
import org.forgerock.opendj.ldap.Attribute;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.Connection;
import org.forgerock.opendj.ldap.LdapException;
import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.responses.SearchResultEntry;
import org.forgerock.opendj.ldif.ConnectionEntryReader;
/**
* This singleton attempts to query vendor information of a Directory Server.
*/
public class DirectoryServerVendor {
public static String OPENDS = "opends";
public static String OPENDJ = "opendj";
public static String ODSEE = "odsee";
private static String VENDOR_OPENDJ = "OpenDJ ";
private static String VENDOR_OPENDS = "OpenDS Directory Server ";
private static String VENDOR_SUNDS_5 = "Sun-ONE-Directory/";
private static String VENDOR_SUNDS_6 = "Sun-Java(tm)-System-Directory/";
private static String VENDOR_SUNDS_7 = "Sun-Directory-Server/";
private static String VENDOR_ODSEE_11 = "Oracle Directory Server Enterprise Edition";
private static DirectoryServerVendor instance = new DirectoryServerVendor();
private String[] attrs = {
"vendorversion", "rootDomainNamingContext", "forestFunctionality"};
private Vendor unknownVendor = new Vendor("unknown", "unknown");
private DirectoryServerVendor () {
}
/**
* Returns an instance of this class.
*
* @return an instance of this class.
*/
public static DirectoryServerVendor getInstance() {
return instance;
}
/**
* Returns the vendor of Directory Server.
* @param conn LDAP connection to the server.
* @return the vendor of Directory Server.
* @throws LdapException if unable to get the vendor information.
* @throws SearchResultReferenceIOException if unable to get the vendor information
*/
public Vendor query(Connection conn) throws LdapException, SearchResultReferenceIOException {
String result = null;
ConnectionEntryReader res = conn.search(LDAPRequests.newSearchRequest("", SearchScope.BASE_OBJECT,
"(objectclass=*)", attrs));
while (res.hasNext()) {
if (res.isReference()) {
//ignore
res.readReference();
} else {
SearchResultEntry findEntry = res.readEntry();
/* Get the attributes of the root DSE. */
for (Attribute attribute : findEntry.getAllAttributes()) {
String attrName = attribute.getAttributeDescriptionAsString();
if ("vendorversion".equalsIgnoreCase(attrName)) {
for (ByteString value : attribute) {
result = value.toString();
break;
}
}
}
}
}
Vendor vendor = unknownVendor;
if (result != null) {
if (result.startsWith(VENDOR_OPENDJ)) {
String version = result.substring(VENDOR_OPENDJ.length());
vendor = new Vendor(OPENDJ, version);
} else if (result.startsWith(VENDOR_OPENDS)) {
String version = result.substring(VENDOR_OPENDS.length());
vendor = new Vendor(OPENDS, version);
} else if (result.startsWith(VENDOR_SUNDS_5)) {
String version = result.substring(VENDOR_SUNDS_5.length());
vendor = new Vendor(ODSEE, version);
} else if (result.startsWith(VENDOR_SUNDS_6)) {
String version = result.substring(VENDOR_SUNDS_6.length());
vendor = new Vendor(ODSEE, version);
} else if (result.startsWith(VENDOR_SUNDS_7)) {
String version = result.substring(VENDOR_SUNDS_7.length());
vendor = new Vendor(ODSEE, version);
} else if (result.startsWith(VENDOR_ODSEE_11)) {
String version = result.substring(VENDOR_ODSEE_11.length());
vendor = new Vendor(ODSEE, version);
}
}
return vendor;
}
public class Vendor {
public String name;
public String version;
public Vendor(String name, String version) {
this.name = name;
this.version = version;
}
public String toString() {
return name + " " + version;
}
}
}