1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-20 08:23:50 +03:00

r8585: add to ldb and ldap comparison functionality

better pares filters
Approx is currently only a stub need to dig more info to
understand what it really means and how it works exactly
This commit is contained in:
Simo Sorce
2005-07-19 09:09:00 +00:00
committed by Gerald (Jerry) Carter
parent 26a676a4e3
commit a9e8cd0bad
7 changed files with 540 additions and 290 deletions

View File

@@ -113,14 +113,53 @@ static int ldb_match_present(struct ldb_context *ldb,
return 0;
}
static int ldb_match_comparison(struct ldb_context *ldb,
struct ldb_message *msg,
struct ldb_parse_tree *tree,
const char *base,
enum ldb_scope scope,
enum ldb_parse_op comp_op)
{
unsigned int i;
struct ldb_message_element *el;
const struct ldb_attrib_handler *h;
int ret;
/* FIXME: APPROX comparison not handled yet */
if (comp_op == LDB_OP_APPROX) return 0;
el = ldb_msg_find_element(msg, tree->u.comparison.attr);
if (el == NULL) {
return 0;
}
h = ldb_attrib_handler(ldb, el->name);
for (i = 0; i < el->num_values; i++) {
ret = h->comparison_fn(ldb, ldb, &el->values[i], &tree->u.comparison.value);
if (ret == 0) {
return 1;
}
if (ret > 0 && comp_op == LDB_OP_GREATER) {
return 1;
}
if (ret < 0 && comp_op == LDB_OP_LESS) {
return 1;
}
}
return 0;
}
/*
match a simple leaf node
*/
static int ldb_match_simple(struct ldb_context *ldb,
struct ldb_message *msg,
struct ldb_parse_tree *tree,
const char *base,
enum ldb_scope scope)
static int ldb_match_equality(struct ldb_context *ldb,
struct ldb_message *msg,
struct ldb_parse_tree *tree,
const char *base,
enum ldb_scope scope)
{
unsigned int i;
struct ldb_message_element *el;
@@ -128,12 +167,12 @@ static int ldb_match_simple(struct ldb_context *ldb,
struct ldb_dn *msgdn, *valuedn;
int ret;
if (ldb_attr_cmp(tree->u.simple.attr, "dn") == 0) {
if (ldb_attr_cmp(tree->u.equality.attr, "dn") == 0) {
msgdn = ldb_dn_explode_casefold(ldb, msg->dn);
if (msgdn == NULL) return 0;
valuedn = ldb_dn_explode_casefold(ldb, tree->u.simple.value.data);
valuedn = ldb_dn_explode_casefold(ldb, tree->u.equality.value.data);
if (valuedn == NULL) {
talloc_free(msgdn);
return 0;
@@ -148,7 +187,7 @@ static int ldb_match_simple(struct ldb_context *ldb,
return 0;
}
el = ldb_msg_find_element(msg, tree->u.simple.attr);
el = ldb_msg_find_element(msg, tree->u.equality.attr);
if (el == NULL) {
return 0;
}
@@ -156,7 +195,7 @@ static int ldb_match_simple(struct ldb_context *ldb,
h = ldb_attrib_handler(ldb, el->name);
for (i=0;i<el->num_values;i++) {
if (h->comparison_fn(ldb, ldb, &tree->u.simple.value,
if (h->comparison_fn(ldb, ldb, &tree->u.equality.value,
&el->values[i]) == 0) {
return 1;
}
@@ -242,7 +281,7 @@ static int ldb_match_substring(struct ldb_context *ldb,
unsigned int i;
struct ldb_message_element *el;
el = ldb_msg_find_element(msg, tree->u.simple.attr);
el = ldb_msg_find_element(msg, tree->u.substring.attr);
if (el == NULL) {
return 0;
}
@@ -357,21 +396,6 @@ static int ldb_match_message(struct ldb_context *ldb,
int v;
switch (tree->operation) {
case LDB_OP_SIMPLE:
return ldb_match_simple(ldb, msg, tree, base, scope);
case LDB_OP_PRESENT:
return ldb_match_present(ldb, msg, tree, base, scope);
case LDB_OP_SUBSTRING:
return ldb_match_substring(ldb, msg, tree, base, scope);
case LDB_OP_EXTENDED:
return ldb_match_extended(ldb, msg, tree, base, scope);
case LDB_OP_NOT:
return ! ldb_match_message(ldb, msg, tree->u.isnot.child, base, scope);
case LDB_OP_AND:
for (i=0;i<tree->u.list.num_elements;i++) {
v = ldb_match_message(ldb, msg, tree->u.list.elements[i],
@@ -387,6 +411,31 @@ static int ldb_match_message(struct ldb_context *ldb,
if (v) return 1;
}
return 0;
case LDB_OP_NOT:
return ! ldb_match_message(ldb, msg, tree->u.isnot.child, base, scope);
case LDB_OP_EQUALITY:
return ldb_match_equality(ldb, msg, tree, base, scope);
case LDB_OP_SUBSTRING:
return ldb_match_substring(ldb, msg, tree, base, scope);
case LDB_OP_GREATER:
return ldb_match_comparison(ldb, msg, tree, base, scope, LDB_OP_GREATER);
case LDB_OP_LESS:
return ldb_match_comparison(ldb, msg, tree, base, scope, LDB_OP_LESS);
case LDB_OP_PRESENT:
return ldb_match_present(ldb, msg, tree, base, scope);
case LDB_OP_APPROX:
return ldb_match_comparison(ldb, msg, tree, base, scope, LDB_OP_APPROX);
case LDB_OP_EXTENDED:
return ldb_match_extended(ldb, msg, tree, base, scope);
}
return 0;