1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-26 04:23:49 +03:00

r7936: new ldb_dn_explode and ldb_dn_casefold functions and co

This commit is contained in:
Simo Sorce
2005-06-26 23:59:22 +00:00
committed by Gerald (Jerry) Carter
parent 83d9d8f482
commit 7ccf21ab4e
7 changed files with 70 additions and 86 deletions

View File

@@ -52,7 +52,7 @@ LDB_TDB_OBJ=ldb_tdb/ldb_match.o ldb_tdb/ldb_tdb.o \
COMMON_OBJ=common/ldb.o common/ldb_ldif.o \
common/ldb_parse.o common/ldb_msg.o common/ldb_utf8.o \
common/ldb_debug.o common/ldb_modules.o \
common/ldb_explode_dn.o
common/ldb_dn.o
MODULES_OBJ=modules/timestamps.o modules/schema.o

View File

@@ -59,7 +59,7 @@ char *ldb_casefold(void *mem_ctx, const char *s)
a caseless compare, optimised for 7 bit
TODO: doesn't yet handle UTF8
*/
static int ldb_caseless_cmp(const char *s1, const char *s2)
int ldb_caseless_cmp(const char *s1, const char *s2)
{
int i;
for (i=0;s1[i] != 0;i++) {
@@ -89,81 +89,3 @@ int ldb_attr_cmp(const char *dn1, const char *dn2)
return ldb_caseless_cmp(dn1, dn2);
}
/*
casefold a dn. We need to uppercase the attribute names, and the
attribute values of case insensitive attributes. We also need to remove
extraneous spaces between elements
*/
char *ldb_dn_fold(void * mem_ctx,
const char * dn,
void * user_data,
int (* case_fold_attr_fn)(void * user_data, char * attr))
{
const char *dn_orig = dn;
TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
char *ret;
size_t len;
ret = talloc_strdup(tmp_ctx, "");
if (ret == NULL) goto failed;
while ((len = strcspn(dn, ",")) > 0) {
char *p = strchr(dn, '=');
char *attr, *value;
int case_fold_required;
if (p == NULL || (p-dn) > len) goto failed;
attr = talloc_strndup(tmp_ctx, dn, p-dn);
if (attr == NULL) goto failed;
/* trim spaces from the attribute name */
while (' ' == *attr) attr++;
while (' ' == attr[strlen(attr)-1]) {
attr[strlen(attr)-1] = 0;
}
if (*attr == 0) goto failed;
value = talloc_strndup(tmp_ctx, p+1, len-(p+1-dn));
if (value == NULL) goto failed;
/* trim spaces from the value */
while (' ' == *value) value++;
while (' ' == value[strlen(value)-1]) {
value[strlen(value)-1] = 0;
}
if (*value == 0) goto failed;
case_fold_required = case_fold_attr_fn(user_data, attr);
attr = ldb_casefold(tmp_ctx, attr);
if (attr == NULL) goto failed;
talloc_steal(tmp_ctx, attr);
if (case_fold_required) {
value = ldb_casefold(tmp_ctx, value);
if (value == NULL) goto failed;
talloc_steal(tmp_ctx, value);
}
if (dn[len] == ',') {
ret = talloc_asprintf_append(ret, "%s=%s,", attr, value);
} else {
ret = talloc_asprintf_append(ret, "%s=%s", attr, value);
}
if (ret == NULL) goto failed;
dn += len;
if (*dn == ',') dn++;
}
talloc_steal(mem_ctx, ret);
talloc_free(tmp_ctx);
return ret;
failed:
talloc_free(tmp_ctx);
return ldb_casefold(mem_ctx, dn_orig);
}

View File

@@ -70,7 +70,7 @@ ADD_OBJ_FILES = \
lib/ldb/common/ldb_utf8.o \
lib/ldb/common/ldb_debug.o \
lib/ldb/common/ldb_modules.o \
lib/ldb/common/ldb_explode_dn.o
lib/ldb/common/ldb_dn.o
REQUIRED_SUBSYSTEMS = \
LIBREPLACE LIBTALLOC LDBSAMBA
NOPROTO = YES

View File

@@ -279,6 +279,7 @@ const char *ldb_errstring(struct ldb_context *ldb);
casefold a string (should be UTF8, but at the moment it isn't)
*/
char *ldb_casefold(void *mem_ctx, const char *s);
int ldb_caseless_cmp(const char *s1, const char *s2);
/*
ldif manipulation functions

View File

@@ -38,6 +38,7 @@
#include "includes.h"
#include "ldb/include/ldb.h"
#include "ldb/include/ldb_private.h"
#include "ldb/include/ldb_dn.h"
#include "ldb/ldb_tdb/ldb_tdb.h"
#define LDBLOCK "INT_LDBLOCK"
@@ -107,9 +108,30 @@ struct TDB_DATA ltdb_key(struct ldb_module *module, const char *dn)
talloc_free(attr_name_folded);
}
talloc_free(attr_name);
} else {
dn_folded = ldb_dn_fold(module->ldb, dn,
module, ltdb_case_fold_attr_required);
}
/* special cases for tdb */
else if (*dn == '@' || strncmp(LDBLOCK, dn, strlen(LDBLOCK)) == 0) {
dn_folded = talloc_strdup(ldb, dn);
}
else {
struct ldb_dn *edn, *cedn;
edn = ldb_dn_explode(ldb, dn);
if (!edn)
goto failed;
cedn = ldb_dn_casefold(ldb, edn, module,
ltdb_case_fold_attr_required);
if (!edn)
goto failed;
dn_folded = ldb_dn_linearize(ldb, cedn);
if (!dn_folded)
goto failed;
talloc_free(edn);
talloc_free(cedn);
}
if (!dn_folded) {
@@ -141,6 +163,7 @@ failed:
static int ltdb_lock(struct ldb_module *module, const char *lockname)
{
struct ltdb_private *ltdb = module->private_data;
char *lock_dn;
TDB_DATA key;
int ret;
@@ -148,14 +171,21 @@ static int ltdb_lock(struct ldb_module *module, const char *lockname)
return -1;
}
key = ltdb_key(module, lockname);
lock_dn = talloc_asprintf(module->ldb, "%s_%s", LDBLOCK, lockname);
if (lock_dn == NULL) {
return -1;
}
key = ltdb_key(module, lock_dn);
if (!key.dptr) {
talloc_free(lock_dn);
return -1;
}
ret = tdb_chainlock(ltdb->tdb, key);
talloc_free(key.dptr);
talloc_free(lock_dn);
return ret;
}
@@ -166,20 +196,28 @@ static int ltdb_lock(struct ldb_module *module, const char *lockname)
static int ltdb_unlock(struct ldb_module *module, const char *lockname)
{
struct ltdb_private *ltdb = module->private_data;
char *lock_dn;
TDB_DATA key;
if (lockname == NULL) {
return -1;
}
key = ltdb_key(module, lockname);
lock_dn = talloc_asprintf(module->ldb, "%s_%s", LDBLOCK, lockname);
if (lock_dn == NULL) {
return -1;
}
key = ltdb_key(module, lock_dn);
if (!key.dptr) {
talloc_free(lock_dn);
return -1;
}
tdb_chainunlock(ltdb->tdb, key);
talloc_free(key.dptr);
talloc_free(lock_dn);
return 0;
}

View File

@@ -917,6 +917,28 @@ char *talloc_strdup(const void *t, const char *p)
return ret;
}
/*
append to a talloced string
*/
char *talloc_append_string(const void *t, char *orig, const char *append)
{
char *ret;
size_t olen = strlen(orig);
size_t alenz = strlen(append) + 1;
if (!append)
return orig;
ret = talloc_realloc(t, orig, char, olen + alenz);
if (!ret)
return NULL;
/* append the string with the trailing \0 */
memcpy(&ret[olen], append, alenz);
return ret;
}
/*
strndup with a talloc
*/

View File

@@ -119,6 +119,7 @@ void *_talloc_zero(const void *ctx, size_t size, const char *name);
void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name);
char *talloc_strdup(const void *t, const char *p);
char *talloc_strndup(const void *t, const char *p, size_t n);
char *talloc_append_string(const void *t, char *orig, const char *append);
char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
char *talloc_asprintf_append(char *s,