From c537edfa2d427471f24c19a4051287d24a0bc7e3 Mon Sep 17 00:00:00 2001 From: Artem Smotrakov <asmotrak@openjdk.org> Date: Thu, 25 Jun 2015 20:20:41 +0800 Subject: [PATCH] 8129575: Equal DelegationPermission instances may return different hash codes Reviewed-by: mullan, weijun --- .../auth/kerberos/DelegationPermission.java | 61 +++-------------- .../kerberos/DelegationPermissionHash.java | 67 +++++++++++++++++++ 2 files changed, 77 insertions(+), 51 deletions(-) create mode 100644 jdk/test/javax/security/auth/kerberos/DelegationPermissionHash.java diff --git a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java index 108505dbb52..ac4bb0717c0 100644 --- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java +++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java @@ -140,37 +140,32 @@ public final class DelegationPermission extends BasicPermission */ @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 @@ public final class DelegationPermission extends BasicPermission */ @Override public int hashCode() { - return getName().hashCode(); + return 17 * subordinate.hashCode() + 31 * service.hashCode(); } /** @@ -223,42 +218,6 @@ public final class DelegationPermission extends BasicPermission 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); - } - } - */ } diff --git a/jdk/test/javax/security/auth/kerberos/DelegationPermissionHash.java b/jdk/test/javax/security/auth/kerberos/DelegationPermissionHash.java new file mode 100644 index 00000000000..e9ac23b8c45 --- /dev/null +++ b/jdk/test/javax/security/auth/kerberos/DelegationPermissionHash.java @@ -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"); + } +}