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

svn commit: r567530 - in /harmony/enhanced/classlib/branches/java6/modules/auth/src: main/java/common/javax/security/auth/x500/X500Principal.java test/java/common/tests/api/javax/security/auth/x500/X500PrincipalTest.java

Author: leoli
Date: Sun Aug 19 20:02:05 2007
New Revision: 567530

URL: http://svn.apache.org/viewvc?rev=567530&view=rev
Log:
Add Java 6 new feature in auth module (javax.security.auth.x500.X500Principal(String, Map<String, String )and javax.security.auth.x500.X500Principal.getName(String,Map<String,String>)).

Modified:
    harmony/enhanced/classlib/branches/java6/modules/auth/src/main/java/common/javax/security/auth/x500/X500Principal.java
    harmony/enhanced/classlib/branches/java6/modules/auth/src/test/java/common/tests/api/javax/security/auth/x500/X500PrincipalTest.java

Modified: harmony/enhanced/classlib/branches/java6/modules/auth/src/main/java/common/javax/security/auth/x500/X500Principal.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/auth/src/main/java/common/javax/security/auth/x500/X500Principal.java?rev=567530&r1=567529&r2=567530&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/auth/src/main/java/common/javax/security/auth/x500/X500Principal.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/auth/src/main/java/common/javax/security/auth/x500/X500Principal.java Sun Aug 19 20:02:05 2007
@@ -23,6 +23,7 @@
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.security.Principal;
+import java.util.Map;
 
 import org.apache.harmony.auth.internal.nls.Messages;
 import org.apache.harmony.security.x501.Name;
@@ -86,6 +87,22 @@
             throw iae;
         }
     }
+    
+    public X500Principal(String name, Map<String,String> keywordMap){
+        super();
+        if (name == null) {
+            throw new NullPointerException(Messages.getString("auth.00")); //$NON-NLS-1$
+        }
+        
+        try {
+            dn = new Name(substituteNameFromMap(name,keywordMap));
+        } catch (IOException e) {
+            IllegalArgumentException iae = new IllegalArgumentException(Messages
+                    .getString("auth.2D")); //$NON-NLS-1$
+            iae.initCause(e);
+            throw iae;
+        }
+    }
 
     @Override
     public boolean equals(Object o) {
@@ -113,6 +130,68 @@
     public String getName(String format) {
         return dn.getName(format);
     }
+    
+    public String getName(String format, Map<String, String> oidMap) {
+        String rfc1779Name = dn.getName(RFC1779);
+        String rfc2253Name = dn.getName(RFC2253);
+
+        if (format.toUpperCase().equals("RFC1779")) {
+            StringBuilder resultName = new StringBuilder(rfc1779Name);
+            int fromIndex = resultName.length();
+            int equalIndex = -1;
+            while (-1 != (equalIndex = resultName.lastIndexOf("=", fromIndex))) {
+                int commaIndex = resultName.lastIndexOf(",", equalIndex);
+                String subName = resultName.substring(commaIndex + 1,
+                        equalIndex).trim();
+                if (subName.length() > 4
+                        && subName.substring(0, 4).equals("OID.")) {
+                    String subSubName = subName.substring(4);
+                    if (oidMap.containsKey(subSubName)) {
+                        String replaceName = oidMap.get(subSubName);
+                        if(commaIndex > 0) replaceName = " " + replaceName;
+                        resultName.replace(commaIndex + 1, equalIndex, replaceName);
+                    }
+                }
+                fromIndex = commaIndex;
+            }
+            return resultName.toString();
+        } else if (format.toUpperCase().equals("RFC2253")) {
+            StringBuilder resultName = new StringBuilder(rfc2253Name);
+            StringBuilder subsidyName = new StringBuilder(rfc1779Name);
+
+            int fromIndex = resultName.length();
+            int subsidyFromIndex = subsidyName.length();
+            int equalIndex = -1;
+            int subsidyEqualIndex = -1;
+            while (-1 != (equalIndex = resultName.lastIndexOf("=", fromIndex))) {
+                subsidyEqualIndex = subsidyName.lastIndexOf("=",
+                        subsidyFromIndex);
+                int commaIndex = resultName.lastIndexOf(",", equalIndex);
+                String subName = resultName.substring(commaIndex + 1,
+                        equalIndex).trim();
+                if (oidMap.containsKey(subName)) {
+                    int subOrignalEndIndex = resultName
+                            .indexOf(",", equalIndex);
+                    if (subOrignalEndIndex == -1)
+                        subOrignalEndIndex = resultName.length();
+                    int subGoalEndIndex = subsidyName.indexOf(",",
+                            subsidyEqualIndex);
+                    if (subGoalEndIndex == -1)
+                        subGoalEndIndex = subsidyName.length();
+                    resultName.replace(equalIndex + 1, subOrignalEndIndex,
+                            subsidyName.substring(subsidyEqualIndex + 1,
+                                    subGoalEndIndex));
+                    resultName.replace(commaIndex + 1, equalIndex, oidMap
+                            .get(subName));
+                }
+                fromIndex = commaIndex;
+                subsidyFromIndex = subsidyEqualIndex - 1;
+            }
+            return resultName.toString();
+        } else {
+            throw new IllegalArgumentException("invalid format specified");
+        }
+    }
 
     @Override
     public int hashCode() {
@@ -131,5 +210,20 @@
     private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
 
         dn = (Name) Name.ASN1.decode((byte[]) in.readObject());
+    }
+    
+    private String substituteNameFromMap(String name, Map<String,String> keywordMap){
+        StringBuilder sbName = new StringBuilder(name);
+        int fromIndex = sbName.length();
+        int equalIndex = -1;
+        while(-1 != (equalIndex = sbName.lastIndexOf("=",fromIndex))){
+            int commaIndex = sbName.lastIndexOf(",",equalIndex);
+            String subName = sbName.substring(commaIndex+1, equalIndex).trim();
+            if(keywordMap.containsKey(subName)){
+                sbName.replace(commaIndex+1, equalIndex, keywordMap.get(subName));
+            }
+            fromIndex = commaIndex;
+        }
+        return sbName.toString();
     }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/auth/src/test/java/common/tests/api/javax/security/auth/x500/X500PrincipalTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/auth/src/test/java/common/tests/api/javax/security/auth/x500/X500PrincipalTest.java?rev=567530&r1=567529&r2=567530&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/auth/src/test/java/common/tests/api/javax/security/auth/x500/X500PrincipalTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/auth/src/test/java/common/tests/api/javax/security/auth/x500/X500PrincipalTest.java Sun Aug 19 20:02:05 2007
@@ -17,6 +17,9 @@
 
 package tests.api.javax.security.auth.x500;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.security.auth.x500.X500Principal;
 
 public class X500PrincipalTest extends junit.framework.TestCase {
@@ -31,6 +34,20 @@
 		String expectedOuput = "CN=Hermione Granger,O=Apache Software Foundation,OU=Harmony,L=Hogwarts,ST=Hants,C=GB";
 		assertEquals("Output order precedence problem", expectedOuput, name);
 	}
+    
+    /**
+     * @tests javax.security.auth.x500.X500Principal#X500Principal(java.lang.String, java.util.Map)
+     */
+    public void test_ConstructorLjava_lang_String_java_util_Map(){
+        Map<String, String> keyword = new HashMap<String, String>();
+        keyword.put("CN", "2.19");
+        keyword.put("OU", "1.2.5.19");
+        keyword.put("O", "1.2.5");
+        X500Principal X500p = new X500Principal("CN=Duke, OU=JavaSoft, O=Sun Microsystems, C=US ,CN=DD",keyword);
+        String name = X500p.getName();
+        String expectedOut = "2.19=#130444756b65,1.2.5.19=#13084a617661536f6674,1.2.5=#131053756e204d6963726f73797374656d73,C=US,2.19=#13024444";
+        assertEquals("Output order precedence problem", expectedOut, name);
+    }
 
 	/**
 	 * @tests javax.security.auth.x500.X500Principal#getName(java.lang.String)
@@ -43,4 +60,30 @@
 		assertEquals("CANONICAL output differs from expected result", expected,
 				canonical);
 	}
+    
+    /**
+     * @tests javax.security.auth.x500.X500Principal#getName(java.lang.String, java.util.Map)
+     */
+    public void test_getNameLjava_lang_String_java_util_Map() {
+        Map<String, String> keyword = new HashMap<String, String>();
+        keyword.put("CN", "2.19");
+        keyword.put("OU", "1.2.5.19");
+        keyword.put("O", "1.2.5");
+        X500Principal X500p = new X500Principal("CN=Duke, OU=JavaSoft, O=Sun Microsystems, C=US ,CN=DD",keyword);
+        keyword = new HashMap<String, String>();
+        keyword.put("2.19", "mystring");
+        String rfc1779Name = X500p.getName("RFC1779",keyword);
+        String rfc2253Name = X500p.getName("RFC2253",keyword);
+        String expected1779Out = "mystring=Duke, OID.1.2.5.19=JavaSoft, OID.1.2.5=Sun Microsystems, C=US, mystring=DD";
+        String expected2253Out = "mystring=Duke,1.2.5.19=#13084a617661536f6674,1.2.5=#131053756e204d6963726f73797374656d73,C=US,mystring=DD";
+        assertEquals("Output order precedence problem", expected1779Out, rfc1779Name);
+        assertEquals("Output order precedence problem", expected2253Out, rfc2253Name);
+        try{
+            X500p.getName("CANONICAL",keyword);
+            fail("Should throw IllegalArgumentException exception here");
+        }
+        catch(IllegalArgumentException e){
+            //expected IllegalArgumentException here
+        }
+    }
 }