summaryrefslogtreecommitdiff
path: root/source4/dsdb
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2011-08-09 14:41:20 +1000
committerAndrew Bartlett <abartlet@samba.org>2011-08-09 11:56:23 +0200
commit4ede333f468b36fb7435c9de1216da3b66bf0490 (patch)
tree2fb641d6df7f893ca29432fc89fe732d673a1450 /source4/dsdb
parent2ba18d89eb066cf52d8bbd18a28e494bb4247d9c (diff)
downloadsamba-4ede333f468b36fb7435c9de1216da3b66bf0490.tar.gz
samba-4ede333f468b36fb7435c9de1216da3b66bf0490.tar.bz2
samba-4ede333f468b36fb7435c9de1216da3b66bf0490.zip
s4-dsdb: add auto-normalisation of attributes
this auto-normalises some attributes when they are added/modified. The list that we auto-normalise is currently: Boolean INT32 INTEGER UTC_TIME This fixes a problem with groupType being stored in an unnormalised form Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'source4/dsdb')
-rw-r--r--source4/dsdb/samdb/ldb_modules/objectclass_attrs.c47
-rw-r--r--source4/dsdb/schema/schema.h1
-rw-r--r--source4/dsdb/schema/schema_syntax.c12
3 files changed, 57 insertions, 3 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c
index 4525cf3ddd..9893adae93 100644
--- a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c
+++ b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c
@@ -88,6 +88,45 @@ static int oc_validate_dsheuristics(struct ldb_message_element *el)
return LDB_SUCCESS;
}
+/*
+ auto normalise values on input
+ */
+static int oc_auto_normalise(struct ldb_context *ldb, const struct dsdb_attribute *attr,
+ struct ldb_message *msg, struct ldb_message_element *el)
+{
+ int i;
+ bool values_copied = false;
+
+ for (i=0; i<el->num_values; i++) {
+ struct ldb_val v;
+ int ret;
+ ret = attr->ldb_schema_attribute->syntax->canonicalise_fn(ldb, el->values, &el->values[i], &v);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+ if (data_blob_cmp(&v, &el->values[i]) == 0) {
+ /* no need to replace it */
+ talloc_free(v.data);
+ continue;
+ }
+
+ /* we need to copy the values array on the first change */
+ if (!values_copied) {
+ struct ldb_val *v2;
+ v2 = talloc_array(msg->elements, struct ldb_val, el->num_values);
+ if (v2 == NULL) {
+ return ldb_oom(ldb);
+ }
+ memcpy(v2, el->values, sizeof(struct ldb_val) * el->num_values);
+ el->values = v2;
+ values_copied = true;
+ }
+
+ el->values[i] = v;
+ }
+ return LDB_SUCCESS;
+}
+
static int attr_handler(struct oc_context *ac)
{
struct ldb_context *ldb;
@@ -174,6 +213,14 @@ static int attr_handler(struct oc_context *ac)
}
}
+ /* auto normalise some attribute values */
+ if (attr->syntax->auto_normalise) {
+ ret = oc_auto_normalise(ldb, attr, msg, &msg->elements[i]);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+ }
+
/* Substitute the attribute name to match in case */
msg->elements[i].name = attr->lDAPDisplayName;
}
diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h
index 13cc31ca87..58cf82b297 100644
--- a/source4/dsdb/schema/schema.h
+++ b/source4/dsdb/schema/schema.h
@@ -73,6 +73,7 @@ struct dsdb_syntax {
WERROR (*validate_ldb)(const struct dsdb_syntax_ctx *ctx,
const struct dsdb_attribute *attr,
const struct ldb_message_element *in);
+ bool auto_normalise;
};
struct dsdb_attribute {
diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c
index d443c009af..501ab3aded 100644
--- a/source4/dsdb/schema/schema_syntax.c
+++ b/source4/dsdb/schema/schema_syntax.c
@@ -2365,7 +2365,8 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
.ldb_to_drsuapi = dsdb_syntax_BOOL_ldb_to_drsuapi,
.validate_ldb = dsdb_syntax_BOOL_validate_ldb,
.equality = "booleanMatch",
- .comment = "Boolean"
+ .comment = "Boolean",
+ .auto_normalise = true
},{
.name = "Integer",
.ldap_oid = LDB_SYNTAX_INTEGER,
@@ -2376,7 +2377,8 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
.validate_ldb = dsdb_syntax_INT32_validate_ldb,
.equality = "integerMatch",
.comment = "Integer",
- .ldb_syntax = LDB_SYNTAX_SAMBA_INT32
+ .ldb_syntax = LDB_SYNTAX_SAMBA_INT32,
+ .auto_normalise = true
},{
.name = "String(Octet)",
.ldap_oid = LDB_SYNTAX_OCTET_STRING,
@@ -2417,7 +2419,8 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
.drsuapi_to_ldb = dsdb_syntax_INT32_drsuapi_to_ldb,
.ldb_to_drsuapi = dsdb_syntax_INT32_ldb_to_drsuapi,
.validate_ldb = dsdb_syntax_INT32_validate_ldb,
- .ldb_syntax = LDB_SYNTAX_SAMBA_INT32
+ .ldb_syntax = LDB_SYNTAX_SAMBA_INT32,
+ .auto_normalise = true
},{
/* not used in w2k3 forest */
.name = "String(Numeric)",
@@ -2473,6 +2476,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
.validate_ldb = dsdb_syntax_NTTIME_UTC_validate_ldb,
.equality = "generalizedTimeMatch",
.comment = "UTC Time",
+ .auto_normalise = true
},{
.name = "String(Generalized-Time)",
.ldap_oid = "1.3.6.1.4.1.1466.115.121.1.24",
@@ -2484,6 +2488,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
.equality = "generalizedTimeMatch",
.comment = "Generalized Time",
.ldb_syntax = LDB_SYNTAX_UTC_TIME,
+ .auto_normalise = true
},{
/* not used in w2k3 schema */
.name = "String(Case Sensitive)",
@@ -2522,6 +2527,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
.equality = "integerMatch",
.comment = "Large Integer",
.ldb_syntax = LDB_SYNTAX_INTEGER,
+ .auto_normalise = true
},{
.name = "String(NT-Sec-Desc)",
.ldap_oid = LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR,