You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fu...@apache.org on 2003/12/12 22:31:56 UTC

cvs commit: jakarta-tomcat-4.0/catalina/src/test/org/apache/catalina/realm JNDIRealmTestCase.java

funkman     2003/12/12 13:31:56

  Modified:    catalina/src/share/org/apache/catalina/realm JNDIRealm.java
               catalina/src/test/org/apache/catalina/realm
                        JNDIRealmTestCase.java
  Log:
  BZ 23190 16541
  Make JNDIRealm escape search filters
  
  Patch by Jeff Tulley jtulley AT novell dot com
  
  Revision  Changes    Path
  1.16      +51 -4     jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java
  
  Index: JNDIRealm.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- JNDIRealm.java	4 Sep 2003 19:59:47 -0000	1.15
  +++ JNDIRealm.java	12 Dec 2003 21:31:56 -0000	1.16
  @@ -90,6 +90,7 @@
   import org.apache.catalina.util.StringManager;
   import org.apache.catalina.util.Base64;
   
  +
   /**
    * <p>Implementation of <strong>Realm</strong> that works with a directory
    * server accessed via the Java Naming and Directory Interface (JNDI) APIs.
  @@ -1340,6 +1341,7 @@
   
           // Set up parameters for an appropriate search
           String filter = roleFormat.format(new String[] { dn, username });
  +        filter = doRFC2254Encoding(filter);
           SearchControls controls = new SearchControls();
           if (roleSubtree)
               controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  @@ -1671,6 +1673,51 @@
           return null;
   
       }
  +
  +
  +    /**
  +     * Given an LDAP search string, returns the string with certain characters
  +     * escaped according to RFC 2254 guidelines.
  +     * The character mapping is as follows:
  +     *     char ->  Replacement
  +     *    ---------------------------
  +     *     *  -> \2a
  +     *     (  -> \28
  +     *     )  -> \29
  +     *     \  -> \5c
  +     *     \0 -> \00
  +     * @param inString string to escape according to RFC 2254 guidelines
  +     * @return
  +     */
  +    protected String doRFC2254Encoding(String inString) {
  +        StringBuffer buf = new StringBuffer(inString.length());
  +        for (int i = 0; i < inString.length(); i++) {
  +            char c = inString.charAt(i);
  +            switch (c) {
  +                case '\\':
  +                    buf.append("\\5c");
  +                    break;
  +                case '*':
  +                    buf.append("\\2a");
  +                    break;
  +                case '(':
  +                    buf.append("\\28");
  +                    break;
  +                case ')':
  +                    buf.append("\\29");
  +                    break;
  +                case '\0':
  +                    buf.append("\\00");
  +                    break;
  +                default:
  +                    buf.append(c);
  +                    break;
  +            }
  +        }
  +        return buf.toString();
  +    }
  +
  +
   }
   
   // ------------------------------------------------------ Private Classes
  
  
  
  1.2       +69 -2     jakarta-tomcat-4.0/catalina/src/test/org/apache/catalina/realm/JNDIRealmTestCase.java
  
  Index: JNDIRealmTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/test/org/apache/catalina/realm/JNDIRealmTestCase.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JNDIRealmTestCase.java	4 Sep 2003 19:59:47 -0000	1.1
  +++ JNDIRealmTestCase.java	12 Dec 2003 21:31:56 -0000	1.2
  @@ -247,6 +247,73 @@
           assertStringArraysEquals(expected, actual);
       }
   
  +
  +    public void testRFC2254EncodingEmptyString() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("");
  +        Assert.assertEquals("empty", "", actual);
  +    }
  +
  +    public void testRFC2254EncodingNoChange() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=aname,o=acontext");
  +        Assert.assertEquals("no change", "cn=aname,o=acontext", actual);
  +    }
  +
  +    public void testRFC2254EncodingAsterisk() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=some*name,o=somecontext");
  +        Assert.assertEquals("asterisk", "cn=some\\2aname,o=somecontext", actual);
  +    }
  +
  +    public void testRFC2254EncodingAsteriskAtEnd() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=somename,o=somecontext*");
  +        Assert.assertEquals("asterisk", "cn=somename,o=somecontext\\2a", actual);
  +    }
  +
  +    public void testRFC2254EncodingAsteriskAtBeginning() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=*somename,o=somecontext");
  +        Assert.assertEquals("asterisk", "cn=\\2asomename,o=somecontext", actual);
  +    }
  +
  +    public void testRFC2254EncodingOpenParen() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=somena(me,o=somecontext");
  +        Assert.assertEquals("asterisk", "cn=somena\\28me,o=somecontext", actual);
  +    }
  +
  +    public void testRFC2254EncodingCloseParen() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=somename,o=some)context");
  +        Assert.assertEquals("asterisk", "cn=somename,o=some\\29context", actual);
  +    }
  +
  +    public void testRFC2254EncodingSlash() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=s\\omename,o=somecontext");
  +        Assert.assertEquals("asterisk", "cn=s\\5comename,o=somecontext", actual);
  +    }
  +
  +    public void testRFC2254EncodingNul() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=so\0mename,o=somecontext");
  +        Assert.assertEquals("asterisk", "cn=so\\00mename,o=somecontext", actual);
  +    }
  +
  +    public void testRFC2254EncodingTwoCharsInARow() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=so\\\\mename,o=somecontext");
  +        Assert.assertEquals("asterisk", "cn=so\\5c\\5cmename,o=somecontext", actual);
  +    }
  +
  +    public void testRFC2254EncodingAllEncodedChars() {
  +        JNDIRealm realm = new JNDIRealm();
  +        String actual = realm.doRFC2254Encoding("cn=so\\*()\0\\mename,o=somecontext");
  +        Assert.assertEquals("asterisk", "cn=so\\5c\\2a\\28\\29\\00\\5cmename,o=somecontext", actual);
  +    }
  +
       public void assertStringArraysEquals(String[] expected, String[] actual) {
           Assert.assertTrue("not null", actual != null);
           Assert.assertEquals("array count is wrong", expected.length, actual.length);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org