diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-06-13 06:52:48 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:18:05 -0500 |
commit | e5c70a58873d5f274ec38d85884e0e76bbbaa291 (patch) | |
tree | ea9c6bd8472cda3a576ddab675d8b16ae9d143f2 /source4/lib | |
parent | 04b350acf8f060f9c654ce0e8d73d6edfa20a0fc (diff) | |
download | samba-e5c70a58873d5f274ec38d85884e0e76bbbaa291.tar.gz samba-e5c70a58873d5f274ec38d85884e0e76bbbaa291.tar.bz2 samba-e5c70a58873d5f274ec38d85884e0e76bbbaa291.zip |
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 used to be commit 04356c1b1ed86d72934bc1b0ed60b767e10a1196)
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/ldb/common/ldb_parse.c | 55 | ||||
-rw-r--r-- | source4/lib/ldb/include/ldb_parse.h | 5 |
2 files changed, 57 insertions, 3 deletions
diff --git a/source4/lib/ldb/common/ldb_parse.c b/source4/lib/ldb/common/ldb_parse.c index 8058cceed4..e2eb0f8c78 100644 --- a/source4/lib/ldb/common/ldb_parse.c +++ b/source4/lib/ldb/common/ldb_parse.c @@ -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; +} diff --git a/source4/lib/ldb/include/ldb_parse.h b/source4/lib/ldb/include/ldb_parse.h index 741a8af618..c8d89d2165 100644 --- a/source4/lib/ldb/include/ldb_parse.h +++ b/source4/lib/ldb/include/ldb_parse.h @@ -35,7 +35,7 @@ #ifndef _LDB_PARSE_H #define _LDB_PARSE_H 1 -enum ldb_parse_op {LDB_OP_SIMPLE, LDB_OP_AND, LDB_OP_OR, LDB_OP_NOT}; +enum ldb_parse_op {LDB_OP_SIMPLE=1, LDB_OP_AND='&', LDB_OP_OR='|', LDB_OP_NOT='!'}; struct ldb_parse_tree { enum ldb_parse_op operation; @@ -55,6 +55,7 @@ struct ldb_parse_tree { }; struct ldb_parse_tree *ldb_parse_tree(TALLOC_CTX *mem_ctx, const char *s); -const char *ldb_binary_encode(TALLOC_CTX *ctx, struct ldb_val val); +char *ldb_filter_from_tree(TALLOC_CTX *mem_ctx, struct ldb_parse_tree *tree); +char *ldb_binary_encode(TALLOC_CTX *ctx, struct ldb_val val); #endif |