svn commit: samba r8038 - in branches/SAMBA_4_0/source/lib/ldb: ldb_tdb samba

tridge at samba.org tridge at samba.org
Fri Jul 1 07:02:27 GMT 2005


Author: tridge
Date: 2005-07-01 07:02:26 +0000 (Fri, 01 Jul 2005)
New Revision: 8038

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

Log:
- fixed indexing on binary values that need base64 encoding and canonicalisation

- added support for recognising the S- form of objectsid in search
  expressions. I thought this could be done with just a comparison
  modified comparison function, but it turns out it also needs a
  canonicalisation function so that indexing can work

Modified:
   branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c
   branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c	2005-07-01 06:21:26 UTC (rev 8037)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c	2005-07-01 07:02:26 UTC (rev 8038)
@@ -118,9 +118,8 @@
 		talloc_free(attr_folded);
 		return NULL;
 	}
-	
 	if (ldb_should_b64_encode(&v)) {
-		char *vstr = ldb_base64_encode(ldb, value->data, value->length);
+		char *vstr = ldb_base64_encode(ldb, v.data, v.length);
 		if (!vstr) return NULL;
 		ret = talloc_asprintf(ldb, "%s:%s::%s", LTDB_INDEX, attr_folded, vstr);
 		talloc_free(vstr);

Modified: branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c	2005-07-01 06:21:26 UTC (rev 8037)
+++ branches/SAMBA_4_0/source/lib/ldb/samba/ldif_handlers.c	2005-07-01 07:02:26 UTC (rev 8038)
@@ -85,17 +85,39 @@
 	    strncmp(v2->data, "S-", 2) == 0) {
 		return strcmp(v1->data, v2->data);
 	}
+	if (strncmp(v1->data, "S-", 2) == 0) {
+		struct ldb_val v;
+		int ret;
+		if (ldif_read_objectSid(ldb, v1, &v) != 0) {
+			return -1;
+		}
+		ret = ldb_comparison_binary(ldb, &v, v2);
+		talloc_free(v.data);
+		return ret;
+	}
 	return ldb_comparison_binary(ldb, v1, v2);
 }
 
+/*
+  canonicalise a objectSid
+*/
+static int ldb_canonicalise_objectSid(struct ldb_context *ldb, const struct ldb_val *in,
+				      struct ldb_val *out)
+{
+	if (strncmp(in->data, "S-", 2) == 0) {
+		return ldif_read_objectSid(ldb, in, out);
+	}
+	return ldb_handler_copy(ldb, in, out);
+}
 
+
 static const struct ldb_attrib_handler samba_handlers[] = {
 	{ 
 		.attr            = "objectSid",
 		.flags           = 0,
 		.ldif_read_fn    = ldif_read_objectSid,
 		.ldif_write_fn   = ldif_write_objectSid,
-		.canonicalise_fn = ldb_handler_copy,
+		.canonicalise_fn = ldb_canonicalise_objectSid,
 		.comparison_fn   = ldb_comparison_objectSid
 	}
 };



More information about the samba-cvs mailing list