From 5d137e0d2f9bbf85a059db4670f0a87d48e0c833 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Tue, 20 Apr 2010 19:30:31 +0800 Subject: [PATCH] 6944847: native gss lib names on linux Reviewed-by: valeriep --- .../jgss/wrapper/SunNativeProvider.java | 38 ++++--- .../sun/security/krb5/Krb5NameEquals.java | 78 +++++++++++++ jdk/test/sun/security/krb5/runNameEquals.sh | 106 ++++++++++++++++++ 3 files changed, 207 insertions(+), 15 deletions(-) create mode 100644 jdk/test/sun/security/krb5/Krb5NameEquals.java create mode 100644 jdk/test/sun/security/krb5/runNameEquals.sh diff --git a/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java b/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java index e212da7d5c3..5a71cdfaaa5 100644 --- a/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java +++ b/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,26 +77,34 @@ public final class SunNativeProvider extends Provider { if (DEBUG) err.printStackTrace(); return null; } - String gssLib = System.getProperty(LIB_PROP); - if (gssLib == null || gssLib.trim().equals("")) { + String gssLibs[] = new String[0]; + String defaultLib = System.getProperty(LIB_PROP); + if (defaultLib == null || defaultLib.trim().equals("")) { String osname = System.getProperty("os.name"); if (osname.startsWith("SunOS")) { - gssLib = "libgss.so"; + gssLibs = new String[]{ "libgss.so" }; } else if (osname.startsWith("Linux")) { - gssLib = "libgssapi.so"; + gssLibs = new String[]{ + "libgssapi.so", + "libgssapi_krb5.so", + }; } + } else { + gssLibs = new String[]{ defaultLib }; } - if (GSSLibStub.init(gssLib)) { - debug("Loaded GSS library: " + gssLib); - Oid[] mechs = GSSLibStub.indicateMechs(); - HashMap map = - new HashMap(); - for (int i = 0; i < mechs.length; i++) { - debug("Native MF for " + mechs[i]); - map.put("GssApiMechanism." + mechs[i], - MF_CLASS); + for (String libName: gssLibs) { + if (GSSLibStub.init(libName)) { + debug("Loaded GSS library: " + libName); + Oid[] mechs = GSSLibStub.indicateMechs(); + HashMap map = + new HashMap(); + for (int i = 0; i < mechs.length; i++) { + debug("Native MF for " + mechs[i]); + map.put("GssApiMechanism." + mechs[i], + MF_CLASS); + } + return map; } - return map; } return null; } diff --git a/jdk/test/sun/security/krb5/Krb5NameEquals.java b/jdk/test/sun/security/krb5/Krb5NameEquals.java new file mode 100644 index 00000000000..d319fb5dcde --- /dev/null +++ b/jdk/test/sun/security/krb5/Krb5NameEquals.java @@ -0,0 +1,78 @@ +/* + * Copyright 2007-2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @bug 4634392 + * @summary JDK code doesn't respect contract for equals and hashCode + * @author Andrew Fan + */ + +import org.ietf.jgss.*; + +public class Krb5NameEquals { + + private static String NAME_STR1 = "service@host"; + private static String NAME_STR2 = "service@host2"; + private static final Oid MECH; + + static { + Oid temp = null; + try { + temp = new Oid("1.2.840.113554.1.2.2"); // KRB5 + } catch (Exception e) { + // should never happen + } + MECH = temp; + } + + public static void main(String[] argv) throws Exception { + GSSManager mgr = GSSManager.getInstance(); + + boolean result = true; + // Create GSSName and check their equals(), hashCode() impl + GSSName name1 = mgr.createName(NAME_STR1, + GSSName.NT_HOSTBASED_SERVICE, MECH); + GSSName name2 = mgr.createName(NAME_STR2, + GSSName.NT_HOSTBASED_SERVICE, MECH); + GSSName name3 = mgr.createName(NAME_STR1, + GSSName.NT_HOSTBASED_SERVICE, MECH); + + if (!name1.equals(name3) || !name1.equals(name3) || + !name1.equals((Object) name1) || + !name1.equals((Object) name3)) { + System.out.println("Error: should be the same name"); + result = false; + } else if (name1.hashCode() != name3.hashCode()) { + System.out.println("Error: should have same hash"); + result = false; + } + + if (name1.equals(name2) || name1.equals((Object) name2)) { + System.out.println("Error: should be different names"); + result = false; + } + if (result) { + System.out.println("Done"); + } else System.exit(1); + } +} diff --git a/jdk/test/sun/security/krb5/runNameEquals.sh b/jdk/test/sun/security/krb5/runNameEquals.sh new file mode 100644 index 00000000000..cddba722cb0 --- /dev/null +++ b/jdk/test/sun/security/krb5/runNameEquals.sh @@ -0,0 +1,106 @@ +# +# Copyright 2009-2010 Sun Microsystems, Inc. All Rights Reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, +# CA 95054 USA or visit www.sun.com if you need additional information or +# have any questions. +# + +# @test +# @bug 6317711 6944847 +# @summary Ensure the GSSName has the correct impl which respects +# the contract for equals and hashCode across different configurations. + +# set a few environment variables so that the shell-script can run stand-alone +# in the source directory + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC="." +fi + +if [ "${TESTCLASSES}" = "" ] ; then + TESTCLASSES="." +fi + +if [ "${TESTJAVA}" = "" ] ; then + echo "TESTJAVA not set. Test cannot execute." + echo "FAILED!!!" + exit 1 +fi + +NATIVE=false + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + SunOS ) + PATHSEP=":" + FILESEP="/" + NATIVE=true + ;; + Linux ) + PATHSEP=":" + FILESEP="/" + NATIVE=true + ;; + CYGWIN* ) + PATHSEP=";" + FILESEP="/" + ;; + Windows* ) + PATHSEP=";" + FILESEP="\\" + ;; + * ) + echo "Unrecognized system!" + exit 1; + ;; +esac + +TEST=Krb5NameEquals + +${TESTJAVA}${FILESEP}bin${FILESEP}javac \ + -d ${TESTCLASSES}${FILESEP} \ + ${TESTSRC}${FILESEP}${TEST}.java + +EXIT_STATUS=0 + +if [ "${NATIVE}" = "true" ] ; then + echo "Testing native provider" + ${TESTJAVA}${FILESEP}bin${FILESEP}java \ + -classpath ${TESTCLASSES} \ + -Dsun.security.jgss.native=true \ + ${TEST} + if [ $? != 0 ] ; then + echo "Native provider fails" + EXIT_STATUS=1 + fi +fi + +echo "Testing java provider" +${TESTJAVA}${FILESEP}bin${FILESEP}java \ + -classpath ${TESTCLASSES} \ + -Djava.security.krb5.realm=R \ + -Djava.security.krb5.kdc=127.0.0.1 \ + ${TEST} +if [ $? != 0 ] ; then + echo "Java provider fails" + EXIT_STATUS=1 +fi + +exit ${EXIT_STATUS}