8129575: Equal DelegationPermission instances may return different hash codes
authorasmotrak
Thu, 25 Jun 2015 20:20:41 +0800
changeset 31265 2eabccc392ed
parent 31264 896105040033
child 31266 89dc3f0c1983
8129575: Equal DelegationPermission instances may return different hash codes Reviewed-by: mullan, weijun
jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java
jdk/test/javax/security/auth/kerberos/DelegationPermissionHash.java
--- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java	Thu Jun 25 09:03:23 2015 +0800
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java	Thu Jun 25 20:20:41 2015 +0800
@@ -140,37 +140,32 @@
      */
     @Override
     public boolean implies(Permission p) {
-        if (!(p instanceof DelegationPermission))
-            return false;
-
-        DelegationPermission that = (DelegationPermission) p;
-        if (this.subordinate.equals(that.subordinate) &&
-            this.service.equals(that.service))
-            return true;
-
-        return false;
+        return equals(p);
     }
 
-
     /**
      * Checks two DelegationPermission objects for equality.
      *
      * @param obj the object to test for equality with this object.
      *
      * @return true if {@code obj} is a DelegationPermission, and
-     *  has the same subordinate and service principal as this.
+     *  has the same subordinate and service principal as this
      *  DelegationPermission object.
      */
     @Override
     public boolean equals(Object obj) {
-        if (obj == this)
+        if (obj == this) {
             return true;
+        }
 
-        if (! (obj instanceof DelegationPermission))
+        if (!(obj instanceof DelegationPermission)) {
             return false;
+        }
 
         DelegationPermission that = (DelegationPermission) obj;
-        return implies(that);
+
+        return this.subordinate.equals(that.subordinate) &&
+                this.service.equals(that.service);
     }
 
     /**
@@ -180,7 +175,7 @@
      */
     @Override
     public int hashCode() {
-        return getName().hashCode();
+        return 17 * subordinate.hashCode() + 31 * service.hashCode();
     }
 
     /**
@@ -223,42 +218,6 @@
         init(getName());
     }
 
-    /*
-      public static void main(String args[]) throws Exception {
-      DelegationPermission this_ =
-      new DelegationPermission(args[0]);
-      DelegationPermission that_ =
-      new DelegationPermission(args[1]);
-      System.out.println("-----\n");
-      System.out.println("this.implies(that) = " + this_.implies(that_));
-      System.out.println("-----\n");
-      System.out.println("this = "+this_);
-      System.out.println("-----\n");
-      System.out.println("that = "+that_);
-      System.out.println("-----\n");
-
-      KrbDelegationPermissionCollection nps =
-      new KrbDelegationPermissionCollection();
-      nps.add(this_);
-      nps.add(new DelegationPermission("\"host/foo.example.com@EXAMPLE.COM\" \"CN=Gary Ellison/OU=JSN/O=SUNW/L=Palo Alto/ST=CA/C=US\""));
-      try {
-      nps.add(new DelegationPermission("host/foo.example.com@EXAMPLE.COM \"CN=Gary Ellison/OU=JSN/O=SUNW/L=Palo Alto/ST=CA/C=US\""));
-      } catch (Exception e) {
-      System.err.println(e);
-      }
-
-      System.out.println("nps.implies(that) = " + nps.implies(that_));
-      System.out.println("-----\n");
-
-      Enumeration e = nps.elements();
-
-      while (e.hasMoreElements()) {
-      DelegationPermission x =
-      (DelegationPermission) e.nextElement();
-      System.out.println("nps.e = " + x);
-      }
-      }
-    */
 }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/security/auth/kerberos/DelegationPermissionHash.java	Thu Jun 25 20:20:41 2015 +0800
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.security.auth.kerberos.DelegationPermission;
+
+/*
+ * @test
+ * @bug 8129575
+ * @summary Checks if DelegationPermission.hashCode() works fine
+ */
+public class DelegationPermissionHash {
+
+    static final String princ1 = "backup/bar.example.com@EXAMPLE.COM";
+    static final String princ2 = "backup/foo.example.com@EXAMPLE.COM";
+    static final String ONE_SPACE = " ";
+    static final String TWO_SPACES = "  ";
+    static final String QUOTE = "\"";
+
+    public static void main(String[] args) {
+        DelegationPermission one = new DelegationPermission(
+                QUOTE + princ1 + QUOTE + ONE_SPACE + QUOTE + princ2 + QUOTE);
+        DelegationPermission two = new DelegationPermission(
+                QUOTE + princ1 + QUOTE + TWO_SPACES + QUOTE + princ2 + QUOTE);
+
+        System.out.println("one.getName() = " + one.getName());
+        System.out.println("two.getName() = " + two.getName());
+
+        if (!one.implies(two) || !two.implies(one)) {
+            throw new RuntimeException("Test failed: "
+                    + "one and two don't imply each other");
+        }
+
+        if (!one.equals(two)) {
+            throw new RuntimeException("Test failed: one is not equal to two");
+        }
+
+        System.out.println("one.hashCode() = " + one.hashCode());
+        System.out.println("two.hashCode() = " + two.hashCode());
+        if (one.hashCode() != two.hashCode()) {
+            throw new RuntimeException("Test failed: hash codes are not equal");
+        }
+
+        System.out.println("Test passed");
+    }
+}