2016-12-14 2 views
0

J'ai inséré un enregistrement dans Ldap en utilisant JNDI. Son nom est c=""aa. JNDI a fait un travail d'échapper cela pour moi, donc il a atterri en db comme c=\"\"aa. Ok, c'est ce que je m'attendais à considérer toutes ces règles d'échappement.Impossible d'utiliser un SearchResult pour supprimer un enregistrement (guillemets échappés par double barre oblique inverse)

Maintenant, bien sûr, je veux supprimer cet enregistrement. Je peux le chercher et obtenir son nom. Le nom devrait être bon pour supprimer l'enregistrement.

Le problème est que le code suivant:

SearchResult sr = obtainSearchResultInJndiWay(); 
System.out.println("name: " + sr.getName()) 

retours name: c=\\"\\"aa.

Cela ne fonctionne pas. Je ne peux pas supprimer un tel élément, car il n'est pas trouvé. Je devrais supprimer l'article c=\"\"aa, mais je n'ai aucun moyen d'obtenir le bon LdapName.

Dois-je convertir manuellement les doubles antislashs? J'ai même trouvé un code tiers qui le fait. Est-ce une autre preuve que JNDI est un concept pauvre, comme dans cette question, à propos de forward slashes?

Ma solution est d'interdire l'entrée des barres obliques et des guillemets dans les noms ldap. Est-ce une bonne solution de contournement? Quels autres pièges puis-je espérer? Yat-il un guide pour utiliser JNDI pour Ldap en toute sécurité? Ce sont des questions d'un gars qui se perd. Pour rendre la question plus claire pour Stack: Comment faire face à ce problème?

Répondre

1

Enfin, j'ai résolu ce problème. Je crois que c'est une fonctionnalité non documentée. J'ai plongé dans le code source jdk et navigué à src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java. La partie clé est la suivante:

CompositeName cn = new CompositeName(); 
cn.add(atom); 

Ils traitent le nom doit être retourné comme CompositeName. La documentation de cette classe mentionne l'échappement supplémentaire. Ok, une fois que nous savons, quelle est la nature de la chaîne retournée, nous pouvons le consommer de la bonne façon.

CompositeName compo = new CompositeName(sr.getName()) 
Name absolutePath = new LdapName(sBaseDn).addAll(compo) 
// sBaseDn is the context (the address) in which the search was made. 

Le nom obtenu de cette manière a le nombre requis de barres obliques inverses. Il est capable de consommer toutes sortes de caractères étranges que je pourrais inventer, y compris des barres obliques.