mirror of
https://github.com/samba-team/samba.git
synced 2025-01-15 23:24:37 +03:00
c64116e158
Subclass support was designed to avoid needing to spell out the full list of objectClasses that an entry was in. However, Samba4 now enforces this restriction in the objectClass module, and the way subclass matching was handled was complex and counter-intuitive in my opinion (and did not match LDAP). Andrew Bartlett (This used to be commit f5ce04b904e14445a2a7e7f92e7e1f64b645c6f2)
207 lines
5.1 KiB
C
207 lines
5.1 KiB
C
/*
|
|
ldb database library
|
|
|
|
Copyright (C) Andrew Tridgell 2005
|
|
|
|
** NOTE! The following LGPL license applies to the ldb
|
|
** library. This does NOT imply that all of Samba is released
|
|
** under the LGPL
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 3 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
/*
|
|
register handlers for specific attributes and objectclass relationships
|
|
|
|
this allows a backend to store its schema information in any format
|
|
it likes (or to not have any schema information at all) while keeping the
|
|
message matching logic generic
|
|
*/
|
|
|
|
#include "ldb_includes.h"
|
|
|
|
/*
|
|
add a attribute to the ldb_schema
|
|
|
|
if flags contains LDB_ATTR_FLAG_ALLOCATED
|
|
the attribute name string will be copied using
|
|
talloc_strdup(), otherwise it needs to be a static const
|
|
string at least with a lifetime longer than the ldb struct!
|
|
|
|
the ldb_schema_syntax structure should be a pointer
|
|
to a static const struct or at least it needs to be
|
|
a struct with a longer lifetime than the ldb context!
|
|
|
|
*/
|
|
int ldb_schema_attribute_add_with_syntax(struct ldb_context *ldb,
|
|
const char *attribute,
|
|
unsigned flags,
|
|
const struct ldb_schema_syntax *syntax)
|
|
{
|
|
int i, n;
|
|
struct ldb_schema_attribute *a;
|
|
|
|
n = ldb->schema.num_attributes + 1;
|
|
|
|
a = talloc_realloc(ldb, ldb->schema.attributes,
|
|
struct ldb_schema_attribute, n);
|
|
if (a == NULL) {
|
|
ldb_oom(ldb);
|
|
return -1;
|
|
}
|
|
ldb->schema.attributes = a;
|
|
|
|
for (i = 0; i < ldb->schema.num_attributes; i++) {
|
|
if (ldb_attr_cmp(attribute, a[i].name) < 0) {
|
|
memmove(a+i+1, a+i, sizeof(*a) * (ldb->schema.num_attributes-i));
|
|
break;
|
|
}
|
|
}
|
|
|
|
a[i].name = attribute;
|
|
a[i].flags = flags;
|
|
a[i].syntax = syntax;
|
|
|
|
if (a[i].flags & LDB_ATTR_FLAG_ALLOCATED) {
|
|
a[i].name = talloc_strdup(a, a[i].name);
|
|
if (a[i].name == NULL) {
|
|
ldb_oom(ldb);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
ldb->schema.num_attributes++;
|
|
return 0;
|
|
}
|
|
|
|
static const struct ldb_schema_syntax ldb_syntax_default = {
|
|
.name = LDB_SYNTAX_OCTET_STRING,
|
|
.ldif_read_fn = ldb_handler_copy,
|
|
.ldif_write_fn = ldb_handler_copy,
|
|
.canonicalise_fn = ldb_handler_copy,
|
|
.comparison_fn = ldb_comparison_binary
|
|
};
|
|
|
|
static const struct ldb_schema_attribute ldb_attribute_default = {
|
|
.name = NULL,
|
|
.flags = 0,
|
|
.syntax = &ldb_syntax_default
|
|
};
|
|
|
|
/*
|
|
return the attribute handlers for a given attribute
|
|
*/
|
|
const struct ldb_schema_attribute *ldb_schema_attribute_by_name(struct ldb_context *ldb,
|
|
const char *name)
|
|
{
|
|
int i, e, b = 0, r;
|
|
const struct ldb_schema_attribute *def = &ldb_attribute_default;
|
|
|
|
/* as handlers are sorted, '*' must be the first if present */
|
|
if (strcmp(ldb->schema.attributes[0].name, "*") == 0) {
|
|
def = &ldb->schema.attributes[0];
|
|
b = 1;
|
|
}
|
|
|
|
/* do a binary search on the array */
|
|
e = ldb->schema.num_attributes - 1;
|
|
|
|
while (b <= e) {
|
|
|
|
i = (b + e) / 2;
|
|
|
|
r = ldb_attr_cmp(name, ldb->schema.attributes[i].name);
|
|
if (r == 0) {
|
|
return &ldb->schema.attributes[i];
|
|
}
|
|
if (r < 0) {
|
|
e = i - 1;
|
|
} else {
|
|
b = i + 1;
|
|
}
|
|
|
|
}
|
|
|
|
return def;
|
|
}
|
|
|
|
|
|
/*
|
|
add to the list of ldif handlers for this ldb context
|
|
*/
|
|
void ldb_schema_attribute_remove(struct ldb_context *ldb, const char *name)
|
|
{
|
|
const struct ldb_schema_attribute *a;
|
|
int i;
|
|
|
|
a = ldb_schema_attribute_by_name(ldb, name);
|
|
if (a == NULL) {
|
|
return;
|
|
}
|
|
|
|
if (a->flags & LDB_ATTR_FLAG_ALLOCATED) {
|
|
talloc_free(discard_const_p(char, a->name));
|
|
}
|
|
|
|
i = a - ldb->schema.attributes;
|
|
if (i < ldb->schema.num_attributes - 1) {
|
|
memmove(&ldb->schema.attributes[i],
|
|
a+1, sizeof(*a) * (ldb->schema.num_attributes-(i+1)));
|
|
}
|
|
|
|
ldb->schema.num_attributes--;
|
|
}
|
|
|
|
/*
|
|
setup a attribute handler using a standard syntax
|
|
*/
|
|
int ldb_schema_attribute_add(struct ldb_context *ldb,
|
|
const char *attribute,
|
|
unsigned flags,
|
|
const char *syntax)
|
|
{
|
|
const struct ldb_schema_syntax *s = ldb_standard_syntax_by_name(ldb, syntax);
|
|
return ldb_schema_attribute_add_with_syntax(ldb, attribute, flags, s);
|
|
}
|
|
|
|
/*
|
|
setup the attribute handles for well known attributes
|
|
*/
|
|
int ldb_setup_wellknown_attributes(struct ldb_context *ldb)
|
|
{
|
|
const struct {
|
|
const char *attr;
|
|
const char *syntax;
|
|
} wellknown[] = {
|
|
{ "dn", LDB_SYNTAX_DN },
|
|
{ "distinguishedName", LDB_SYNTAX_DN },
|
|
{ "cn", LDB_SYNTAX_DIRECTORY_STRING },
|
|
{ "dc", LDB_SYNTAX_DIRECTORY_STRING },
|
|
{ "ou", LDB_SYNTAX_DIRECTORY_STRING },
|
|
{ "objectClass", LDB_SYNTAX_OBJECTCLASS }
|
|
};
|
|
int i;
|
|
int ret;
|
|
|
|
for (i=0;i<ARRAY_SIZE(wellknown);i++) {
|
|
ret = ldb_schema_attribute_add(ldb, wellknown[i].attr, 0,
|
|
wellknown[i].syntax);
|
|
if (ret != LDB_SUCCESS) {
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
return LDB_SUCCESS;
|
|
}
|
|
|