You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sm...@apache.org on 2007/02/02 11:12:05 UTC

svn commit: r502562 - in /harmony/enhanced/classlib/trunk/modules/auth/src: main/java/common/javax/security/auth/kerberos/ main/java/common/org/apache/harmony/auth/internal/kerberos/v5/ test/java/common/org/apache/harmony/auth/tests/javax/security/auth...

Author: smishura
Date: Fri Feb  2 02:12:04 2007
New Revision: 502562

URL: http://svn.apache.org/viewvc?view=rev&rev=502562
Log:
Fix for HARMONY-1182:
[classlib][auth] KerberosPrincipal("file:C://") lead to UnsupportedOperationException on Harmony

Modified:
    harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/javax/security/auth/kerberos/KerberosPrincipal.java
    harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/org/apache/harmony/auth/internal/kerberos/v5/PrincipalName.java
    harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/org/apache/harmony/auth/tests/javax/security/auth/kerberos/KerberosPrincipalTest.java

Modified: harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/javax/security/auth/kerberos/KerberosPrincipal.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/javax/security/auth/kerberos/KerberosPrincipal.java?view=diff&rev=502562&r1=502561&r2=502562
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/javax/security/auth/kerberos/KerberosPrincipal.java (original)
+++ harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/javax/security/auth/kerberos/KerberosPrincipal.java Fri Feb  2 02:12:04 2007
@@ -22,7 +22,6 @@
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.security.Principal;
-import java.util.StringTokenizer;
 
 import org.apache.harmony.auth.internal.kerberos.v5.KerberosException;
 import org.apache.harmony.auth.internal.kerberos.v5.KrbClient;
@@ -47,15 +46,15 @@
     public static final int KRB_NT_UID = 5;
 
     // the full name of principal
-    private transient String name;
+    private transient PrincipalName name;
 
     // the realm
     private transient String realm;
 
-    // type of the principal
-    private transient int type;
+    // "principal" @ "realm"
+    private transient String strName;
 
-    private void init(String name) {
+    private void init(int type, String name) {
 
         // FIXME: correctly implement parsing name according to RFC 1964
         // http://www.ietf.org/rfc/rfc1964.txt
@@ -75,7 +74,7 @@
                         .getString("auth.24")); //$NON-NLS-1$
             }
 
-            this.name = name;
+            name = name.substring(0, pos);
         } else {
             // look for default realm name
             try {
@@ -83,30 +82,30 @@
             } catch (KerberosException e) {
                 throw new IllegalArgumentException(e);
             }
-
-            if (realm != null) {
-                this.name = name + '@' + realm;
-            } else {
-                this.name = name;
-            }
         }
+        this.name = new PrincipalName(type, name);
     }
 
     public KerberosPrincipal(String name) {
-        init(name);
-        type = KRB_NT_PRINCIPAL;
+        init(KRB_NT_PRINCIPAL, name);
     }
 
     public KerberosPrincipal(String name, int type) {
-        init(name);
+        init(type, name);
         if (type < 0 || type > KRB_NT_UID) {
             throw new IllegalArgumentException(Messages.getString("auth.25")); //$NON-NLS-1$
         }
-        this.type = type;
     }
 
     public String getName() {
-        return name;
+        if (strName == null) {
+            if (realm == null) {
+                strName = name.getCanonicalName();
+            } else {
+                strName = name.getCanonicalName() + '@' + realm;
+            }
+        }
+        return strName;
     }
 
     public String getRealm() {
@@ -114,7 +113,7 @@
     }
 
     public int getNameType() {
-        return type;
+        return name.getType();
     }
 
     @Override
@@ -133,38 +132,27 @@
 
         KerberosPrincipal that = (KerberosPrincipal) obj;
 
-        return (that.name.equals(this.name) && that.type == this.type);
+        if (realm == null) {
+            return that.realm == null;
+        } else if (!realm.equals(that.realm)) {
+            return false;
+        }
+        return name.equals(that.name);
     }
 
     @Override
     public String toString() {
-        return name;
+        return getName();
     }
 
-    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
+    private void readObject(ObjectInputStream s) throws IOException,
+            ClassNotFoundException {
 
         s.defaultReadObject();
 
-        PrincipalName principalName = PrincipalName.instanceOf((byte[]) s
+        name = PrincipalName.instanceOf((byte[]) s.readObject());
+        realm = (String) ASN1StringType.GENERALSTRING.decode((byte[]) s
                 .readObject());
-        realm = (String) ASN1StringType.GENERALSTRING.decode((byte[]) s.readObject());
-
-        String[] nameString = principalName.getName();
-        StringBuilder buf = new StringBuilder();
-        for (int i = 0; i < (nameString.length - 1); i++) {
-            buf.append(nameString[i]);
-            buf.append('/');
-        }
-        // append last name element
-        buf.append(nameString[nameString.length - 1]);
-
-        // append realm
-        buf.append('@');
-        buf.append(realm);
-
-        name = buf.toString();
-
-        type = principalName.getType();
 
         //FIXME: verify serialized values
     }
@@ -173,23 +161,7 @@
 
         s.defaultWriteObject();
 
-        String[] nameString;
-
-        // FIXME: ignores escaped '/','@' chars
-        int pos = name.indexOf('@');
-        String str = name.substring(0, pos);
-        if (name.indexOf('/') == -1) {
-            //there is only one component in principal name
-            nameString = new String[] { str };
-        } else {
-            StringTokenizer strTknzr = new StringTokenizer(str, "/"); //$NON-NLS-1$
-            nameString = new String[strTknzr.countTokens()];
-            for (int i = 0; i < nameString.length; i++) {
-                nameString[i] = strTknzr.nextToken();
-            }
-        }
-
-        s.writeObject(new PrincipalName(type, nameString).getEncoded());
+        s.writeObject(name.getEncoded());
         s.writeObject(ASN1StringType.GENERALSTRING.encode(realm));
     }
 }

Modified: harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/org/apache/harmony/auth/internal/kerberos/v5/PrincipalName.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/org/apache/harmony/auth/internal/kerberos/v5/PrincipalName.java?view=diff&rev=502562&r1=502561&r2=502562
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/org/apache/harmony/auth/internal/kerberos/v5/PrincipalName.java (original)
+++ harmony/enhanced/classlib/trunk/modules/auth/src/main/java/common/org/apache/harmony/auth/internal/kerberos/v5/PrincipalName.java Fri Feb  2 02:12:04 2007
@@ -21,6 +21,7 @@
 import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.List;
+import java.util.StringTokenizer;
 
 import org.apache.harmony.security.asn1.ASN1Explicit;
 import org.apache.harmony.security.asn1.ASN1Integer;
@@ -64,12 +65,40 @@
         this.name = name;
     }
 
+    public PrincipalName(int type, String str) {
+        this.type = type;
+        
+        // FIXME: ignores escaped '/','@' chars
+        if (str.indexOf('/') == -1) {
+            //there is only one component in principal name
+            name = new String[] { str };
+        } else {
+            StringTokenizer strTknzr = new StringTokenizer(str, "/"); //$NON-NLS-1$
+            name = new String[strTknzr.countTokens()];
+            for (int i = 0; i < name.length; i++) {
+                name[i] = strTknzr.nextToken();
+            }
+        }
+    }
+
     public int getType() {
         return type;
     }
 
     public String[] getName() {
         return name;
+    }
+
+    public String getCanonicalName() {
+        StringBuilder buf = new StringBuilder();
+        for (int i = 0; i < (name.length - 1); i++) {
+            buf.append(name[i]);
+            buf.append('/');
+        }
+        // append last name element
+        buf.append(name[name.length - 1]);
+
+        return buf.toString();
     }
 
     public byte[] getEncoded() {

Modified: harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/org/apache/harmony/auth/tests/javax/security/auth/kerberos/KerberosPrincipalTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/org/apache/harmony/auth/tests/javax/security/auth/kerberos/KerberosPrincipalTest.java?view=diff&rev=502562&r1=502561&r2=502562
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/org/apache/harmony/auth/tests/javax/security/auth/kerberos/KerberosPrincipalTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/org/apache/harmony/auth/tests/javax/security/auth/kerberos/KerberosPrincipalTest.java Fri Feb  2 02:12:04 2007
@@ -77,6 +77,10 @@
         assertEquals("apache.org", principal.getRealm());
         assertEquals(KerberosPrincipal.KRB_NT_PRINCIPAL, principal
                 .getNameType());
+        
+        // Regression for HARMONY-1182
+        principal = new KerberosPrincipal("file:C://@apache.org");
+        assertEquals("file:C:@apache.org", principal.getName());
     }
 
     /**
@@ -264,8 +268,17 @@
      * @tests javax.security.auth.kerberos.KerberosPrincipal#equals(Object)
      */
     public void test_equals() {
+
+        KerberosPrincipal p = new KerberosPrincipal("A@B");
+
+        assertTrue(p.equals(new KerberosPrincipal("A@B")));
+        assertFalse(p.equals(new KerberosPrincipal("A@B.org")));
+        assertFalse(p.equals(new KerberosPrincipal("aaa@B")));
+        assertFalse(p.equals(new KerberosPrincipal("A@B",
+                KerberosPrincipal.KRB_NT_UID)));
+
         // Regression for HARMONY-744
-        assertFalse(new KerberosPrincipal("A@B").equals(null));
-        assertFalse(new KerberosPrincipal("A@B").equals(new Object()));
+        assertFalse(p.equals(null));
+        assertFalse(p.equals(new Object()));
     }
 }