svn commit: samba r6689 - in branches/SAMBA_4_0/source/libcli/ldap: .

tridge at samba.org tridge at samba.org
Tue May 10 01:57:47 GMT 2005


Author: tridge
Date: 2005-05-10 01:57:47 +0000 (Tue, 10 May 2005)
New Revision: 6689

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

Log:
minor ldap client library work

 - added support for binary encoded search filters
 - fixed some const handling
 - changed the message type to an enum, to help debugging



Modified:
   branches/SAMBA_4_0/source/libcli/ldap/ldap.c
   branches/SAMBA_4_0/source/libcli/ldap/ldap.h


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/ldap/ldap.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/ldap/ldap.c	2005-05-10 01:56:00 UTC (rev 6688)
+++ branches/SAMBA_4_0/source/libcli/ldap/ldap.c	2005-05-10 01:57:47 UTC (rev 6689)
@@ -107,6 +107,40 @@
 					       const char **s);
 
 /*
+   decode a RFC2254 binary string representation of a buffer.
+   Used in LDAP filters.
+*/
+static struct ldap_val ldap_binary_decode(TALLOC_CTX *mem_ctx, const char *str)
+{
+	int i, j;
+	struct ldap_val ret;
+	int slen = strlen(str);
+
+	ret.data = talloc_size(mem_ctx, slen);
+	ret.length = 0;
+	if (ret.data == NULL) return ret;
+
+	for (i=j=0;i<slen;i++) {
+		if (str[i] == '\\') {
+			unsigned c;
+			if (sscanf(&str[i+1], "%02X", &c) != 1) {
+				talloc_free(ret.data);
+				ZERO_STRUCT(ret);
+				return ret;
+			}
+			((uint8_t *)ret.data)[j++] = c;
+			i += 2;
+		} else {
+			((uint8_t *)ret.data)[j++] = str[i];
+		}
+	}
+	ret.length = j;
+
+	return ret;
+}
+
+
+/*
   <simple> ::= <attributetype> <filtertype> <attributevalue>
 */
 static struct ldap_parse_tree *ldap_parse_simple(TALLOC_CTX *mem_ctx,
@@ -139,8 +173,7 @@
 
 	ret->operation = LDAP_OP_SIMPLE;
 	ret->u.simple.attr = l;
-	ret->u.simple.value.data = val;
-	ret->u.simple.value.length = val?strlen(val):0;
+	ret->u.simple.value = ldap_binary_decode(ret, val);
 
 	return ret;
 }
@@ -696,10 +729,13 @@
 }
 
 static BOOL ldap_decode_filter(TALLOC_CTX *mem_ctx, struct asn1_data *data,
-			       char **filter)
+			       const char **filterp)
 {
 	uint8_t filter_tag, tag_desc;
+	char *filter = NULL;
 
+	*filterp = NULL;
+
 	if (!asn1_peek_uint8(data, &filter_tag))
 		return False;
 
@@ -715,22 +751,21 @@
 
 		asn1_start_tag(data, ASN1_CONTEXT(0));
 
-		*filter = talloc_strdup(mem_ctx, "(&");
-		if (*filter == NULL)
+		filter = talloc_strdup(mem_ctx, "(&");
+		if (filter == NULL)
 			return False;
 
 		while (asn1_tag_remaining(data) > 0) {
-			char *subfilter;
+			const char *subfilter;
 			if (!ldap_decode_filter(mem_ctx, data, &subfilter))
 				return False;
-			*filter = talloc_asprintf(mem_ctx, "%s%s", *filter,
-						  subfilter);
-			if (*filter == NULL)
+			filter = talloc_asprintf_append(filter, "%s", subfilter);
+			if (filter == NULL)
 				return False;
 		}
 		asn1_end_tag(data);
 
-		*filter = talloc_asprintf(mem_ctx, "%s)", *filter);
+		filter = talloc_asprintf(mem_ctx, "%s)", filter);
 		break;
 	}
 	case 1: {
@@ -740,23 +775,22 @@
 
 		asn1_start_tag(data, ASN1_CONTEXT(1));
 
-		*filter = talloc_strdup(mem_ctx, "(|");
-		if (*filter == NULL)
+		filter = talloc_strdup(mem_ctx, "(|");
+		if (filter == NULL)
 			return False;
 
 		while (asn1_tag_remaining(data) > 0) {
-			char *subfilter;
+			const char *subfilter;
 			if (!ldap_decode_filter(mem_ctx, data, &subfilter))
 				return False;
-			*filter = talloc_asprintf(mem_ctx, "%s%s", *filter,
-						  subfilter);
-			if (*filter == NULL)
+			filter = talloc_asprintf_append(filter, "%s", subfilter);
+			if (filter == NULL)
 				return False;
 		}
 
 		asn1_end_tag(data);
 
-		*filter = talloc_asprintf(mem_ctx, "%s)", *filter);
+		filter = talloc_asprintf(mem_ctx, "%s)", filter);
 		break;
 	}
 	case 3: {
@@ -770,7 +804,7 @@
 		asn1_end_tag(data);
 		if ((data->has_error) || (attrib == NULL) || (value == NULL))
 			return False;
-		*filter = talloc_asprintf(mem_ctx, "(%s=%s)", attrib, value);
+		filter = talloc_asprintf(mem_ctx, "(%s=%s)", attrib, value);
 		break;
 	}
 	case 7: {
@@ -787,7 +821,7 @@
 			return False;
 		asn1_read(data, attr_name, attr_len);
 		attr_name[attr_len] = '\0';
-		*filter = talloc_asprintf(mem_ctx, "(%s=*)", attr_name);
+		filter = talloc_asprintf(mem_ctx, "(%s=*)", attr_name);
 		SAFE_FREE(attr_name);
 		asn1_end_tag(data);
 		break;
@@ -795,8 +829,11 @@
 	default:
 		return False;
 	}
-	if (*filter == NULL)
+	if (filter == NULL)
 		return False;
+
+	*filterp = filter;
+
 	return True;
 }
 
@@ -1260,3 +1297,5 @@
 
 	return (*host != NULL);
 }
+
+

Modified: branches/SAMBA_4_0/source/libcli/ldap/ldap.h
===================================================================
--- branches/SAMBA_4_0/source/libcli/ldap/ldap.h	2005-05-10 01:56:00 UTC (rev 6688)
+++ branches/SAMBA_4_0/source/libcli/ldap/ldap.h	2005-05-10 01:57:47 UTC (rev 6689)
@@ -149,7 +149,7 @@
 	uint32_t timelimit;
 	uint32_t sizelimit;
 	BOOL attributesonly;
-	char *filter;
+	const char *filter;
 	int num_attributes;
 	const char **attributes;
 };
@@ -251,9 +251,9 @@
 
 struct ldap_message {
 	TALLOC_CTX	       *mem_ctx;
-	uint32_t                  messageid;
-	uint8_t                   type;
-	union  ldap_Request     r;
+	uint32_t                messageid;
+	enum ldap_request_tag   type;
+	union ldap_Request      r;
 	int			num_controls;
 	struct ldap_Control    *controls;
 };



More information about the samba-cvs mailing list