6944847: native gss lib names on linux
authorweijun
Tue, 20 Apr 2010 19:30:31 +0800
changeset 5300 a291a0bff79f
parent 5299 61698e8cdf75
child 5301 1bc2a3a47839
6944847: native gss lib names on linux Reviewed-by: valeriep
jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java
jdk/test/sun/security/krb5/Krb5NameEquals.java
jdk/test/sun/security/krb5/runNameEquals.sh
--- a/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java	Sat Apr 17 08:12:00 2010 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java	Tue Apr 20 19:30:31 2010 +0800
@@ -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 @@
                             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<String, String> map =
-                                        new HashMap<String, String>();
-                            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<String, String> map =
+                                            new HashMap<String, String>();
+                                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;
                     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/Krb5NameEquals.java	Tue Apr 20 19:30:31 2010 +0800
@@ -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);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/runNameEquals.sh	Tue Apr 20 19:30:31 2010 +0800
@@ -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}