1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-29 16:23:52 +03:00

r7522: added a ldb_filter_from_tree() function that takes a ldb_parse_tree

and forms a ldab search filter expression. Next step is to make our
ldap server code go from ASN.1 to a ldb_parse_tree, instead of trying
to construct string filters, then add a ldb_search_tree() call to
allow for searches using parse trees.

all of this is being done as I am hitting bitwise '&' ldap search
expressions from w2k, and want to handle them cleanly.
This commit is contained in:
Andrew Tridgell
2005-06-13 06:52:48 +00:00
committed by Gerald (Jerry) Carter
parent d74b7c20b6
commit 04356c1b1e
2 changed files with 57 additions and 3 deletions

View File

@@ -165,7 +165,7 @@ struct ldb_val ldb_binary_decode(TALLOC_CTX *ctx, const char *str)
encode a blob as a RFC2254 binary string, escaping any
non-printable or '\' characters
*/
const char *ldb_binary_encode(TALLOC_CTX *ctx, struct ldb_val val)
char *ldb_binary_encode(TALLOC_CTX *ctx, struct ldb_val val)
{
int i;
char *ret;
@@ -403,3 +403,56 @@ struct ldb_parse_tree *ldb_parse_tree(TALLOC_CTX *mem_ctx, const char *s)
return ldb_parse_simple(mem_ctx, s);
}
/*
construct a ldap parse filter given a parse tree
*/
char *ldb_filter_from_tree(TALLOC_CTX *mem_ctx, struct ldb_parse_tree *tree)
{
char *s, *s2, *ret;
int i;
switch (tree->operation) {
case LDB_OP_SIMPLE:
s = ldb_binary_encode(mem_ctx, tree->u.simple.value);
if (s == NULL) return NULL;
ret = talloc_asprintf(mem_ctx, "(%s=%s)",
tree->u.simple.attr, s);
talloc_free(s);
return ret;
case LDB_OP_AND:
case LDB_OP_OR:
ret = talloc_asprintf(mem_ctx, "(%c", (char)tree->operation);
if (ret == NULL) return NULL;
for (i=0;i<tree->u.list.num_elements;i++) {
s = ldb_filter_from_tree(mem_ctx, tree->u.list.elements[i]);
if (s == NULL) {
talloc_free(ret);
return NULL;
}
s2 = talloc_asprintf_append(ret, "%s", s);
talloc_free(s);
if (s2 == NULL) {
talloc_free(ret);
return NULL;
}
ret = s2;
}
s = talloc_asprintf_append(ret, ")");
if (s == NULL) {
talloc_free(ret);
return NULL;
}
return s;
case LDB_OP_NOT:
s = ldb_filter_from_tree(mem_ctx, tree->u.not.child);
if (s == NULL) return NULL;
ret = talloc_asprintf(mem_ctx, "(!%s)", s);
talloc_free(s);
return ret;
}
return NULL;
}