From 5886e641e60be5d89b27e45d8101a37df68c31ca Mon Sep 17 00:00:00 2001
From: Mark Craig <mark.craig@forgerock.com>
Date: Mon, 21 May 2012 10:45:04 +0000
Subject: [PATCH] Some updates to the example based on Matt's suggestions
---
opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/test/bin/checkRewriterProxy.sh | 94 +++++++++++++++++++++++
opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/RewriterProxy.java | 96 ++++++++++++++---------
2 files changed, 153 insertions(+), 37 deletions(-)
diff --git a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/RewriterProxy.java b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/RewriterProxy.java
index 85426f4..efe6a66 100644
--- a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/RewriterProxy.java
+++ b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/RewriterProxy.java
@@ -30,7 +30,9 @@
import static org.forgerock.opendj.ldap.ErrorResultException.newErrorResult;
import java.io.IOException;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.forgerock.opendj.ldap.Attribute;
import org.forgerock.opendj.ldap.AttributeDescription;
@@ -73,6 +75,7 @@
import org.forgerock.opendj.ldap.responses.Result;
import org.forgerock.opendj.ldap.responses.SearchResultEntry;
import org.forgerock.opendj.ldap.responses.SearchResultReference;
+import org.forgerock.opendj.ldap.schema.AttributeType;
/**
* This example is based on the {@link Proxy}. This example does no load
@@ -206,13 +209,31 @@
private SearchResultEntry rewrite(SearchResultEntry entry) {
// Replace server attributes with client attributes.
- // TODO: Handle attributes with options
- Attribute serverAttribute = entry.getAttribute(
- serverAttributeDescription);
- Attribute clientAttribute = new LinkedAttribute(
- clientAttributeDescription, serverAttribute.toArray());
- entry.addAttribute(clientAttribute);
- entry.removeAttribute(serverAttributeDescription);
+ Set<Attribute> attrsToAdd = new HashSet<Attribute>();
+ Set<AttributeDescription> attrsToRemove = new HashSet<AttributeDescription>();
+
+ for (Attribute a : entry.getAllAttributes(serverAttributeDescription)) {
+ AttributeDescription ad = a.getAttributeDescription();
+ AttributeType at = ad.getAttributeType();
+ if (at.equals(serverAttributeDescription.getAttributeType())) {
+ AttributeDescription clientAttrDesc =
+ AttributeDescription.valueOf(ad.toString()
+ .replaceFirst(
+ serverAttributeTypeName,
+ clientAttributeTypeName));
+ attrsToAdd.add(new LinkedAttribute(clientAttrDesc, a.toArray()));
+ attrsToRemove.add(ad);
+ }
+ }
+
+ if (!attrsToAdd.isEmpty() && !attrsToRemove.isEmpty()) {
+ for (Attribute a : attrsToAdd) {
+ entry.addAttribute(a);
+ }
+ for (AttributeDescription ad : attrsToRemove) {
+ entry.removeAttribute(ad);
+ }
+ }
// Transform the server DN suffix into a client DN suffix.
return entry.setName(entry.getName().toString()
@@ -260,20 +281,19 @@
// Transform the client attribute names into server
// attribute names, fullname;lang-fr ==> cn;lang-fr.
- for (Attribute clientAttribute
+ for (Attribute a
: request.getAllAttributes(clientAttributeDescription)) {
- if (clientAttribute != null) {
- String attrDesc = clientAttribute
+ if (a != null) {
+ String ad = a
.getAttributeDescriptionAsString()
.replaceFirst(clientAttributeTypeName,
serverAttributeTypeName);
- Attribute serverAttribute =
- new LinkedAttribute(
- AttributeDescription.valueOf(attrDesc),
- clientAttribute.toArray());
- rewrittenRequest.addAttribute(serverAttribute);
+ Attribute serverAttr = new LinkedAttribute(
+ AttributeDescription.valueOf(ad),
+ a.toArray());
+ rewrittenRequest.addAttribute(serverAttr);
rewrittenRequest.removeAttribute(
- clientAttribute.getAttributeDescription());
+ a.getAttributeDescription());
}
}
@@ -368,15 +388,15 @@
// Transform the client attribute name into a server
// attribute name, fullname;lang-fr ==> cn;lang-fr.
- String attrName = request.getAttributeDescription().toString();
- if (attrName.toLowerCase().startsWith(
+ String ad = request.getAttributeDescription().toString();
+ if (ad.toLowerCase().startsWith(
clientAttributeTypeName.toLowerCase())) {
- String rewrittenAttrName = attrName
+ String serverAttrDesc = ad
.replaceFirst(clientAttributeTypeName,
serverAttributeTypeName);
request.setAttributeDescription(
AttributeDescription.valueOf(
- rewrittenAttrName));
+ serverAttrDesc));
}
// Transform the client DN into a server DN.
@@ -489,20 +509,20 @@
// attribute names, fullname;lang-fr ==> cn;lang-fr.
List<Modification> mods = request.getModifications();
for (Modification mod : mods) {
- AttributeDescription attrDesc =
- mod.getAttribute().getAttributeDescription();
+ Attribute a = mod.getAttribute();
+ AttributeDescription ad = a.getAttributeDescription();
+ AttributeType at = ad.getAttributeType();
- if (attrDesc.equals(clientAttributeDescription)) {
- String rewrittenAttrName =
- attrDesc.toString()
- .replaceFirst(clientAttributeTypeName,
- serverAttributeTypeName);
- Attribute serverAttribute = new LinkedAttribute(
- AttributeDescription.valueOf(rewrittenAttrName),
- mod.getAttribute().toArray());
+ if (at.equals(clientAttributeDescription.getAttributeType())) {
+ AttributeDescription serverAttrDesc =
+ AttributeDescription.valueOf(ad.toString()
+ .replaceFirst(
+ clientAttributeTypeName,
+ serverAttributeTypeName));
rewrittenRequest.addModification(new Modification(
mod.getModificationType(),
- serverAttribute));
+ new LinkedAttribute(
+ serverAttrDesc, a.toArray())));
} else {
rewrittenRequest.addModification(mod);
}
@@ -581,14 +601,16 @@
private SearchRequest rewrite(final SearchRequest request) {
// Transform the client attribute names to a server
// attribute names, fullname;lang-fr ==> cn;lang-fr.
- String[] attrNames =
- new String[request.getAttributes().size()];
+ String[] a = new String[request.getAttributes().size()];
int count = 0;
for (String attrName : request.getAttributes()) {
- if (attrName.equalsIgnoreCase(clientAttributeTypeName)) {
- attrNames[count] = serverAttributeTypeName;
+ if (attrName.toLowerCase().startsWith(
+ clientAttributeTypeName.toLowerCase())) {
+ a[count] = attrName.replaceFirst(
+ clientAttributeTypeName,
+ serverAttributeTypeName);
} else {
- attrNames[count] = attrName;
+ a[count] = attrName;
}
++count;
}
@@ -605,7 +627,7 @@
Filter.valueOf(request.getFilter().toString()
.replace(clientAttributeTypeName,
serverAttributeTypeName)),
- attrNames);
+ a);
}
};
diff --git a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/test/bin/checkRewriterProxy.sh b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/test/bin/checkRewriterProxy.sh
new file mode 100644
index 0000000..acb3190
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/test/bin/checkRewriterProxy.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+# Smoke test RewriterProxy.java using OpenDJ tools.
+# Depends on http://opendj.forgerock.org/Example.ldif being in OpenDJ.
+
+OPENDJ_TOOLS_DIR="/path/to/OpenDJ/bin" # ldapcompare, ldapdelete, ldapmodify, ldapsearch
+HOST=localhost # Host where proxy listens
+PORT=8389 # Port where proxy listens
+
+BINDDN="uid=kvaughan,ou=People,dc=example,dc=com"
+BINDPWD=bribery
+
+CURRDIR=`pwd`
+
+if [ -e $OPENDJ_TOOLS_DIR ]
+then
+ cd $OPENDJ_TOOLS_DIR
+else
+ exit 1
+fi
+
+#set -x
+
+echo Deleting uid=fdupont,ou=People,o=example...
+./ldapdelete -h $HOST -p $PORT -D $BINDDN -w $BINDPWD uid=fdupont,ou=People,o=example
+echo
+
+echo Adding uid=fdupont,ou=People,o=example...
+./ldapmodify -h $HOST -p $PORT -D $BINDDN -w $BINDPWD -a <<EOF
+
+dn: uid=fdupont,ou=People,o=example
+uid: fdupont
+fullname: Frederique Dupont
+fullname;lang-fr: Fredérique Dupont
+givenName: Fredérique
+sn: Dupont
+objectClass: inetOrgPerson
+objectClass: organizationalPerson
+objectClass: person
+objectClass: posixAccount
+objectClass: top
+ou: People
+ou: Product Development
+telephoneNumber: +33 1 23 45 67 89
+facsimileTelephoneNumber: +33 1 23 45 67 88
+mail: fdupont@example.fr
+roomNumber: 0042
+l: Paris
+gidNumber: 1000
+uidNumber: 1110
+homeDirectory: /home/fdupont
+userPassword: password
+
+EOF
+echo
+
+echo Looking for fullname=Frederique Dupont...
+./ldapsearch -h $HOST -p $PORT -D $BINDDN -w $BINDPWD -b o=example "(fullname=Frederique Dupont)" fullname
+echo
+
+echo Comparing fullname:Frederique Dupont...
+./ldapcompare -h $HOST -p $PORT -D $BINDDN -w $BINDPWD "fullname:Frederique Dupont" uid=fdupont,ou=People,o=example
+echo
+
+echo Changing fullname...
+./ldapmodify -h $HOST -p $PORT -D $BINDDN -w $BINDPWD <<EOM
+
+dn: uid=fdupont,ou=People,o=example
+changetype: modify
+replace: fullname
+fullname: Fred Dupont
+
+EOM
+echo
+
+echo Changing uid=fdupont to uid=qdupont...
+./ldapmodify -h $HOST -p $PORT -D $BINDDN -w $BINDPWD <<EOR
+
+dn: uid=fdupont,ou=People,o=example
+changetype: modrdn
+newrdn: uid=qdupont
+deleteoldrdn: 1
+
+EOR
+echo
+
+echo Deleting uid=qdupont,ou=People,o=example
+./ldapdelete -h $HOST -p $PORT -D $BINDDN -w $BINDPWD uid=qdupont,ou=People,o=example
+echo
+
+cd $CURRDIR
+
+echo Done.
+exit 0
--
Gitblit v1.10.0