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