Return-Path: Delivered-To: apmail-directory-users-archive@www.apache.org Received: (qmail 38982 invoked from network); 8 Apr 2009 13:34:14 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 8 Apr 2009 13:34:14 -0000 Received: (qmail 98836 invoked by uid 500); 8 Apr 2009 13:34:11 -0000 Delivered-To: apmail-directory-users-archive@directory.apache.org Received: (qmail 98689 invoked by uid 500); 8 Apr 2009 13:34:11 -0000 Mailing-List: contact users-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@directory.apache.org Delivered-To: mailing list users@directory.apache.org Received: (qmail 98314 invoked by uid 99); 8 Apr 2009 13:34:05 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Apr 2009 13:34:05 +0000 X-ASF-Spam-Status: No, hits=2.2 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [212.27.42.91] (HELO wmproxy1-g27.free.fr) (212.27.42.91) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Apr 2009 13:33:56 +0000 Received: from wmproxy1-g27.free.fr (localhost [127.0.0.1]) by wmproxy1-g27.free.fr (Postfix) with ESMTP id D5B3B634B6 for ; Wed, 8 Apr 2009 15:33:33 +0200 (CEST) Received: from zimbra3-e1.priv.proxad.net (zimbra3-e1.priv.proxad.net [172.20.243.153]) by wmproxy1-g27.free.fr (Postfix) with ESMTP id EA4E56351C for ; Wed, 8 Apr 2009 15:33:31 +0200 (CEST) Date: Wed, 8 Apr 2009 15:33:31 +0200 (CEST) From: jfmelian@free.fr To: users@directory.apache.org Message-ID: <1562049213.675251239197611536.JavaMail.root@zimbra3-e1.priv.proxad.net> In-Reply-To: <1065589706.674451239197310611.JavaMail.root@zimbra3-e1.priv.proxad.net> Subject: [ApacheDS] search with french accents MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_22791_2010220431.1239197611534" X-Originating-IP: [198.8.67.3] X-Mailer: Zimbra 5.0 (ZimbraWebClient - FF3.0 (Win)/5.0.15_GA_2815.UBUNTU8_64) X-Authenticated-User: jfmelian@free.fr X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_22791_2010220431.1239197611534 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi=20 How to search entries with french accents in the filter ?=20 I have two users :=20 First user (InetOrgPerson):=20 cn=3DAlbert Einstein=20 uid=3Daeinstein=20 ...=20 Second user (InetOrgPerson):=20 cn=3Dr=C3=A9dacteur1=20 uid=3Dr=C3=A9dacteur1=20 ...=20 and a group (GroupOfUniqueNames) with 2 members :=20 uniqueMember=3Duid=3Daeinstein,ou=3DUsers,dc=3Dexample,dc=3Dcom=20 uniqueMember=3Duid=3Dr=C3=A9dacteur1,ou=3DUsers,dc=3Dexample,dc=3Dcom=20 I have wrote a sample to find dn of users and the groups of users (by dn).= =20 I can find the two users but only the group of Albert=20 the output of the test :=20 here the code :=20 package tests;=20 import java.io.UnsupportedEncodingException;=20 import java.util.ArrayList;=20 import java.util.Collection;=20 import java.util.Iterator;=20 import java.util.Properties;=20 import java.util.Map.Entry;=20 import javax.naming.Context;=20 import javax.naming.NamingEnumeration;=20 import javax.naming.NamingException;=20 import javax.naming.NoInitialContextException;=20 import javax.naming.directory.SearchControls;=20 import javax.naming.directory.SearchResult;=20 import javax.naming.ldap.InitialLdapContext;=20 public class LdapSearch=20 {=20 InitialLdapContext ldapContext =3D null;=20 String dn=3D"uid=3Dadmin,ou=3Dsystem";=20 String pwd=3D"secret";=20 String baseSearch=3D"dc=3Dexample, dc=3Dcom";=20 String member=3D"uniqueMember";=20 String groupClass=3D"GroupOfUniqueNames";=20 String fistUser=3D"Albert Einstein";=20 String secondUser=3D"r=C3=A9dacteur1";=20 public static String charToUtf8Hex(char c)=20 {=20 String ss =3D new String();=20 StringBuffer b =3D new StringBuffer();=20 ss +=3D c;=20 byte[] bs;=20 try=20 {=20 bs =3D ss.getBytes("UTF-8");=20 for (int k =3D 0; k < bs.length; k++) {=20 b.append("\\");=20 b.append(UnicodeFormatter.byteToHex(bs[k]));=20 }=20 } catch (UnsupportedEncodingException e)=20 {=20 }=20 return b.toString();=20 }=20 public static String native2ascii(String s){=20 StringBuffer sb =3D new StringBuffer(s.length()*2);=20 char[] array=3Ds.toCharArray();=20 for (int i =3D 0; i < array.length; i++) {=20 switch(array[i]){=20 case '(':=20 case ')':=20 case '\\':=20 case '*':=20 sb.append( UnicodeFormatter.charToUtf8Hex(array[i]) );=20 break;=20 default:=20 if (array[i] <=3D 0x7f) {=20 sb.append(array[i]);=20 } else {=20 sb.append( UnicodeFormatter.charToUtf8Hex(array[i]) );=20 }=20 break;=20 }=20 }=20 return sb.toString();=20 }=20 private InitialLdapContext initializeLdapContext(final String dn, final Obj= ect credential) throws NamingException {=20 InitialLdapContext ldapContext =3D null;=20 final Properties ldapEnvironment =3D new Properties();=20 ldapEnvironment.setProperty(Context.PROVIDER_URL, "ldap://localhost:10389")= ;=20 ldapEnvironment.setProperty(Context.SECURITY_AUTHENTICATION, "simple");=20 ldapEnvironment.setProperty(Context.SECURITY_PRINCIPAL, dn);=20 ldapEnvironment.put(Context.SECURITY_CREDENTIALS, credential);=20 ldapEnvironment.put( "java.naming.ldap.version", "3" );=20 ldapEnvironment.put(Context.REFERRAL, "follow");=20 ldapEnvironment.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.= ldap.LdapCtxFactory");=20 // traceLdapEnv(env);=20 ldapContext =3D new InitialLdapContext(ldapEnvironment, null);=20 return ldapContext;=20 }=20 private String getDNOfUser(final String userName, boolean escapeValue) thro= ws NoInitialContextException, NamingException {=20 String dn =3D null;=20 final StringBuffer filter =3D new StringBuffer();=20 filter.append("(&(cn=3D");=20 if (escapeValue)=20 filter.append(native2ascii(userName));=20 else=20 filter.append(userName);=20 filter.append(")(ObjectClass=3DinetOrgPerson))");=20 final String[] attrNames =3D new String[0];=20 final SearchControls constraints =3D new SearchControls();=20 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);=20 constraints.setCountLimit(1);=20 constraints.setReturningAttributes(attrNames);=20 NamingEnumeration results =3D null;=20 results =3D this.ldapContext.search(this.baseSearch, filter.toString(), nul= l, constraints);=20 if (results.hasMore()) {=20 final SearchResult sr =3D (SearchResult) results.next();=20 if (sr.isRelative() =3D=3D true) {=20 dn =3D sr.getName() + "," + this.baseSearch;=20 } else {=20 dn =3D sr.getName();=20 }=20 }=20 if (results !=3D null) {=20 results.close();=20 }=20 return dn;=20 }=20 private Collection getGroups(String sDN, boolean escapeValue) throw= s NamingException=20 {=20 final ArrayList listDNs =3D new ArrayList();=20 String sBaseSearch =3D null;=20 final StringBuffer sFilter =3D new StringBuffer();=20 sBaseSearch =3D this.baseSearch;=20 sFilter.append("(&(");=20 sFilter.append(member);=20 sFilter.append("=3D");=20 if (escapeValue)=20 sFilter.append(native2ascii(sDN));=20 else=20 sFilter.append(sDN);=20 sFilter.append(")(ObjectClass=3D");=20 sFilter.append(groupClass);=20 sFilter.append("))");=20 final String[] attrNames =3D new String[0];=20 final SearchControls constraints =3D new SearchControls();=20 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);=20 constraints.setCountLimit(0); // no limit=20 constraints.setReturningAttributes(attrNames);=20 NamingEnumeration results =3D null;=20 System.out.println("\t\t\tBase=3D" + sBaseSearch);=20 System.out.println("\t\t\tFilter=3D" + sFilter.toString());=20 results =3D this.ldapContext.search(sBaseSearch, sFilter.toString(), null, = constraints);=20 while (results.hasMoreElements()) {=20 final SearchResult sr =3D (SearchResult) results.nextElement();=20 final StringBuffer dn =3D new StringBuffer();=20 dn.append(sr.getName());=20 if (sr.isRelative() =3D=3D true) {=20 dn.append(",");=20 dn.append(this.baseSearch);=20 }=20 listDNs.add(dn.toString());=20 }=20 if (results !=3D null)=20 results.close();=20 return listDNs;=20 }=20 public static void main(String[] args) throws NamingException=20 {=20 LdapSearch ldapSearch =3D new LdapSearch();=20 ldapSearch.ldapContext =3D ldapSearch.initializeLdapContext(ldapSearch.dn, = ldapSearch.pwd.getBytes());=20 String userDn =3D ldapSearch.getDNOfUser(ldapSearch.fistUser, true);=20 if (userDn !=3D null)=20 {=20 System.out.println("dn of User =3D " + userDn);=20 System.out.println("search groups true");=20 Collectiongroups=3DldapSearch.getGroups(userDn,true);=20 if (groups.size() > 0){=20 for (String s : groups)=20 System.out.println(s);=20 }=20 else=20 System.out.println("not found");=20 System.out.println("search groups false");=20 groups=3DldapSearch.getGroups(userDn,false);=20 if (groups.size() > 0){=20 for (String s : groups)=20 System.out.println(s);=20 }=20 else=20 System.out.println("not found");=20 }=20 else=20 System.out.println(ldapSearch.fistUser + " not found");=20 userDn =3D ldapSearch.getDNOfUser(ldapSearch.secondUser, true);=20 if (userDn !=3D null)=20 {=20 System.out.println("dn of User =3D " + userDn);=20 System.out.println("search groups true");=20 Collectiongroups=3DldapSearch.getGroups(userDn,true);=20 if (groups.size() > 0){=20 for (String s : groups)=20 System.out.println(s);=20 }=20 else=20 System.out.println("not found");=20 System.out.println("search groups false");=20 groups=3DldapSearch.getGroups(userDn,false);=20 if (groups.size() > 0){=20 for (String s : groups)=20 System.out.println(s);=20 }=20 else=20 System.out.println("not found");=20 }=20 else=20 System.out.println(ldapSearch.secondUser + "(true) not found");=20 userDn =3D ldapSearch.getDNOfUser(ldapSearch.secondUser, false);=20 if (userDn !=3D null)=20 {=20 System.out.println("dn of User =3D " + userDn);=20 System.out.println("search groups true");=20 Collectiongroups=3DldapSearch.getGroups(userDn,true);=20 if (groups.size() > 0){=20 for (String s : groups)=20 System.out.println(s);=20 }=20 else=20 System.out.println("not found");=20 System.out.println("search groups false");=20 groups=3DldapSearch.getGroups(userDn,false);=20 if (groups.size() > 0){=20 for (String s : groups)=20 System.out.println(s);=20 }=20 else=20 System.out.println("not found");=20 }=20 else=20 System.out.println(ldapSearch.secondUser + "(false) not found");=20 }=20 }=20 ------=_Part_22791_2010220431.1239197611534--