1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-27 22:50:26 +03:00

s4-dsdb: allow removal of unknown attributes if RELAX set

this allows attributes not known in the schema to be removed if the
caller has set the RELAX control. This will be used by dbcheck to
allow cleaning of bad attributes from the database
This commit is contained in:
Andrew Tridgell 2011-07-05 12:36:16 +10:00
parent 4e63ac6191
commit 28dbd8bbc1
2 changed files with 21 additions and 2 deletions

View File

@ -121,6 +121,12 @@ static int attr_handler(struct oc_context *ac)
attr = dsdb_attribute_by_lDAPDisplayName(ac->schema,
msg->elements[i].name);
if (attr == NULL) {
if (ldb_request_get_control(ac->req, LDB_CONTROL_RELAX_OID) &&
ac->req->operation != LDB_ADD) {
/* we allow this for dbcheck to fix
broken attributes */
goto no_attribute;
}
ldb_asprintf_errstring(ldb, "objectclass_attrs: attribute '%s' on entry '%s' was not found in the schema!",
msg->elements[i].name,
ldb_dn_get_linearized(msg->dn));
@ -172,6 +178,7 @@ static int attr_handler(struct oc_context *ac)
msg->elements[i].name = attr->lDAPDisplayName;
}
no_attribute:
if (ac->req->operation == LDB_ADD) {
ret = ldb_build_add_req(&child_req, ldb, ac,
msg, ac->req->controls,
@ -297,6 +304,11 @@ static int attr_handler2(struct oc_context *ac)
attr = dsdb_attribute_by_lDAPDisplayName(ac->schema,
msg->elements[i].name);
if (attr == NULL) {
if (ldb_request_get_control(ac->req, LDB_CONTROL_RELAX_OID)) {
/* allow this to make it possible for dbcheck
to remove bad attributes */
continue;
}
return ldb_operr(ldb);
}

View File

@ -1042,7 +1042,8 @@ static int replmd_update_rpmd_element(struct ldb_context *ldb,
const struct dsdb_schema *schema,
uint64_t *seq_num,
const struct GUID *our_invocation_id,
NTTIME now)
NTTIME now,
struct ldb_request *req)
{
uint32_t i;
const struct dsdb_attribute *a;
@ -1050,6 +1051,12 @@ static int replmd_update_rpmd_element(struct ldb_context *ldb,
a = dsdb_attribute_by_lDAPDisplayName(schema, el->name);
if (a == NULL) {
if (ldb_request_get_control(req, LDB_CONTROL_RELAX_OID)) {
/* allow this to make it possible for dbcheck
to remove bad attributes */
return LDB_SUCCESS;
}
DEBUG(0,(__location__ ": Unable to find attribute %s in schema\n",
el->name));
return LDB_ERR_OPERATIONS_ERROR;
@ -1299,7 +1306,7 @@ static int replmd_update_rpmd(struct ldb_module *module,
struct ldb_message_element *old_el;
old_el = ldb_msg_find_element(res->msgs[0], msg->elements[i].name);
ret = replmd_update_rpmd_element(ldb, msg, &msg->elements[i], old_el, &omd, schema, seq_num,
our_invocation_id, now);
our_invocation_id, now, req);
if (ret != LDB_SUCCESS) {
return ret;
}