svn commit: samba r12164 - in branches/tmp/samba4_ldap_controls/source/lib/ldb: common include ldb_ildap ldb_ldap tools

idra at samba.org idra at samba.org
Sat Dec 10 13:37:23 GMT 2005


Author: idra
Date: 2005-12-10 13:37:22 +0000 (Sat, 10 Dec 2005)
New Revision: 12164

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12164

Log:
Client side support for exploded dn control
I hate the way Microsoft did this,
there was no need to change the dn given they
have a distinguishedName entry :-(

To support this control I had to add a new ldb_dn
funciotn: ldb_dn_explode_or_special()

This function should gather any present or future
"special" dn like the one produced by this control.

Simo.



Modified:
   branches/tmp/samba4_ldap_controls/source/lib/ldb/common/ldb_dn.c
   branches/tmp/samba4_ldap_controls/source/lib/ldb/include/ldb.h
   branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ildap/ldb_ildap.c
   branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ldap/ldb_ldap.c
   branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c


Changeset:
Modified: branches/tmp/samba4_ldap_controls/source/lib/ldb/common/ldb_dn.c
===================================================================
--- branches/tmp/samba4_ldap_controls/source/lib/ldb/common/ldb_dn.c	2005-12-10 11:22:01 UTC (rev 12163)
+++ branches/tmp/samba4_ldap_controls/source/lib/ldb/common/ldb_dn.c	2005-12-10 13:37:22 UTC (rev 12164)
@@ -417,6 +417,39 @@
 	return NULL;
 }
 
+struct ldb_dn *ldb_dn_explode_or_special(void *mem_ctx, const char *dn)
+{
+	struct ldb_dn *edn; /* the exploded dn */
+
+	if (dn == NULL) return NULL;
+
+	if (strncasecmp(dn, "<GUID=", 6) == 0) {
+		/* this is special DN returned when the
+		 * exploded_dn control is used
+		 */
+
+		/* Allocate a structure to hold the exploded DN */
+		edn = ldb_dn_new(mem_ctx);
+
+		edn->comp_num = 1;
+		edn->components = talloc(edn, struct ldb_dn_component);
+		if (edn->components == NULL) goto failed;
+		edn->components[0].name = talloc_strdup(edn->components, LDB_SPECIAL);
+		if (edn->components[0].name == NULL) goto failed;
+		edn->components[0].value.data = (uint8_t *)talloc_strdup(edn->components, dn);
+		if (edn->components[0].value.data== NULL) goto failed;
+		edn->components[0].value.length = strlen(dn);
+		return edn;
+
+	}
+	
+	return ldb_dn_explode(mem_ctx, dn);
+
+failed:
+	talloc_free(edn);
+	return NULL;
+}
+
 char *ldb_dn_linearize(void *mem_ctx, const struct ldb_dn *edn)
 {
 	char *dn, *value;

Modified: branches/tmp/samba4_ldap_controls/source/lib/ldb/include/ldb.h
===================================================================
--- branches/tmp/samba4_ldap_controls/source/lib/ldb/include/ldb.h	2005-12-10 11:22:01 UTC (rev 12163)
+++ branches/tmp/samba4_ldap_controls/source/lib/ldb/include/ldb.h	2005-12-10 13:37:22 UTC (rev 12164)
@@ -246,12 +246,21 @@
 #define LDB_SYNTAX_UTC_TIME             "1.3.6.1.4.1.1466.115.121.1.53"
 #define LDB_SYNTAX_OBJECTCLASS          "LDB_SYNTAX_OBJECTCLASS"
 
+
+
+#define LDB_CONTROL_PAGED_REQUESTS_OID	"1.2.840.113556.1.4.319"
+#define LDB_CONTROL_EXTENDED_DN_OID	"1.2.840.113556.1.4.529"
+
 struct ldb_paged_control {
 	int size;
 	int cookie_len;
 	char *cookie;
 };
 
+struct ldb_extended_dn_control {
+	int type;
+};
+
 struct ldb_control {
 	const char *oid;
 	BOOL critical;
@@ -438,6 +447,7 @@
 char *ldb_dn_escape_value(void *mem_ctx, struct ldb_val value);
 struct ldb_dn *ldb_dn_new(void *mem_ctx);
 struct ldb_dn *ldb_dn_explode(void *mem_ctx, const char *dn);
+struct ldb_dn *ldb_dn_explode_or_special(void *mem_ctx, const char *dn);
 char *ldb_dn_linearize(void *mem_ctx, const struct ldb_dn *edn);
 char *ldb_dn_linearize_casefold(struct ldb_context *ldb, const struct ldb_dn *edn);
 int ldb_dn_compare_base(struct ldb_context *ldb, const struct ldb_dn *base, const struct ldb_dn *dn);

Modified: branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ildap/ldb_ildap.c
===================================================================
--- branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ildap/ldb_ildap.c	2005-12-10 11:22:01 UTC (rev 12163)
+++ branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ildap/ldb_ildap.c	2005-12-10 13:37:22 UTC (rev 12164)
@@ -236,7 +236,7 @@
 		}
 		(*res)->msgs[i+1] = NULL;
 
-		(*res)->msgs[i]->dn = ldb_dn_explode((*res)->msgs[i], search->dn);
+		(*res)->msgs[i]->dn = ldb_dn_explode_or_special((*res)->msgs[i], search->dn);
 		if ((*res)->msgs[i]->dn == NULL) {
 			goto failed;
 		}

Modified: branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ldap/ldb_ldap.c
===================================================================
--- branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ldap/ldb_ldap.c	2005-12-10 11:22:01 UTC (rev 12163)
+++ branches/tmp/samba4_ldap_controls/source/lib/ldb/ldb_ldap/ldb_ldap.c	2005-12-10 13:37:22 UTC (rev 12164)
@@ -273,7 +273,7 @@
 			goto failed;
 		}
 
-		(*res)->msgs[msg_count]->dn = ldb_dn_explode((*res)->msgs[msg_count], dn);
+		(*res)->msgs[msg_count]->dn = ldb_dn_explode_or_special((*res)->msgs[msg_count], dn);
 		ldap_memfree(dn);
 		if (!(*res)->msgs[msg_count]->dn) {
 			goto failed;

Modified: branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c
===================================================================
--- branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c	2005-12-10 11:22:01 UTC (rev 12163)
+++ branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c	2005-12-10 13:37:22 UTC (rev 12164)
@@ -56,12 +56,12 @@
 	exit(1);
 }
 
-static int do_search(struct ldb_context *ldb,
-		     const struct ldb_dn *basedn,
-		     int scope,
-                     int sort_attribs,
-		     const char *expression,
-		     const char * const *attrs)
+static int search_paged(struct ldb_context *ldb,
+		        const struct ldb_dn *basedn,
+		        int scope,
+                        int sort_attribs,
+		        const char *expression,
+		        const char * const *attrs)
 {
 	int ret, i, total;
 	struct ldb_request req;
@@ -74,7 +74,7 @@
 	ctrl = talloc_array(ldb, struct ldb_control *, 2);
 	ctrl[0] = talloc(ldb, struct ldb_control);
 	ctrl[1] = NULL;
-	ctrl[0]->oid = "1.2.840.113556.1.4.319";
+	ctrl[0]->oid = LDB_CONTROL_PAGED_REQUESTS_OID;
 	ctrl[0]->critical = True;
 	paged_control = talloc(ctrl[0], struct ldb_paged_control);
 	paged_control->size = 10;
@@ -121,6 +121,10 @@
 			ldb_ldif_write_file(ldb, stdout, &ldif);
 		}
 
+		if (result->controls == NULL) {
+			fprintf(stderr, "ERROR: No control reply even if control was marked as critical\n");
+			return 1;
+		}
 		/* paged_result = talloc_get_type(result->controls[0]->data, struct ldb_paged_control); */
 		paged_result = (struct ldb_paged_control *)result->controls[0]->data;
 		if (paged_result->cookie_len == 0) break;
@@ -136,6 +140,67 @@
 	return 0;
 }
 
+static int search_extended_dn(struct ldb_context *ldb,
+			      const struct ldb_dn *basedn,
+			      int scope,
+			      int sort_attribs,
+			      const char *expression,
+			      const char * const *attrs)
+{
+	int ret, i;
+	struct ldb_request req;
+	struct ldb_result *result = NULL;
+	struct ldb_control **ctrl;
+	struct ldb_extended_dn_control *extended_control;
+
+	ctrl = talloc_array(ldb, struct ldb_control *, 2);
+	ctrl[0] = talloc(ldb, struct ldb_control);
+	ctrl[1] = NULL;
+	ctrl[0]->oid = LDB_CONTROL_EXTENDED_DN_OID;
+	ctrl[0]->critical = True;
+	extended_control = talloc(ctrl[0], struct ldb_extended_dn_control);
+	extended_control->type = 0;
+	ctrl[0]->data = extended_control;
+	
+	req.operation = LDB_REQ_SEARCH;
+	req.op.search.base = basedn;
+	req.op.search.scope = scope;
+	req.op.search.tree = ldb_parse_tree(ldb, expression);
+	req.op.search.attrs = attrs;
+	req.op.search.res = NULL;
+	req.controls = ctrl;
+	req.creds = NULL;
+
+	ret = ldb_request(ldb, &req);
+	if (ret != LDB_SUCCESS) {
+		printf("search failed - %s\n", ldb_errstring(ldb));
+		return -1;
+	}
+
+	result = req.op.search.res;
+	printf("# returned %d records\n", result->count);
+
+	for (i = 0; i < result->count; i++) {
+		struct ldb_ldif ldif;
+		printf("# record %d\n", i+1);
+
+		ldif.changetype = LDB_CHANGETYPE_NONE;
+		ldif.msg = result->msgs[i];
+
+		ldb_ldif_write_file(ldb, stdout, &ldif);
+	}
+
+	if (result) {
+		ret = talloc_free(result);
+		if (ret == -1) {
+			fprintf(stderr, "talloc_free failed\n");
+			exit(1);
+		}
+	}
+
+	return 0;
+}
+
  int main(int argc, const char **argv)
 {
 	struct ldb_context *ldb;
@@ -170,18 +235,13 @@
 		}
 	}
 
-	if (options->interactive) {
-		char line[1024];
-		while (fgets(line, sizeof(line), stdin)) {
-			if (do_search(ldb, basedn, 
-				      options->scope, options->sorted, line, attrs) == -1) {
-				ret = -1;
-			}
-		}
-	} else {
-		ret = do_search(ldb, basedn, options->scope, options->sorted, 
-				expression, attrs);
-	}
+	fprintf(stdout, "Searching with paged results control turned on\n");
+	sleep(2);
+	ret = search_paged(ldb, basedn, options->scope, options->sorted, expression, attrs);
+	
+	fprintf(stdout, "Searching with extended dn control turned on\n");
+	sleep(2);
+	ret = search_extended_dn(ldb, basedn, options->scope, options->sorted, expression, attrs);
 
 	talloc_free(ldb);
 	return ret;



More information about the samba-cvs mailing list