summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/dsdb/samdb/ldb_modules/repl_meta_data.c147
1 files changed, 62 insertions, 85 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index b91d5e3db2..7469cadaa8 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -168,6 +168,64 @@ static int add_uint64_element(struct ldb_message *msg, const char *attr, uint64_
return 0;
}
+static int replmd_prepare_originating(struct ldb_module *module, struct ldb_request *req,
+ struct ldb_dn *dn, const char *fn_name,
+ int (*fn)(struct ldb_module *,
+ struct ldb_request *,
+ const struct dsdb_schema *,
+ const struct dsdb_control_current_partition *))
+{
+ const struct dsdb_schema *schema;
+ const struct ldb_control *partition_ctrl;
+ const struct dsdb_control_current_partition *partition;
+
+ /* do not manipulate our control entries */
+ if (ldb_dn_is_special(dn)) {
+ return ldb_next_request(module, req);
+ }
+
+ schema = dsdb_get_schema(module->ldb);
+ if (!schema) {
+ ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+ "replmd_modify: no dsdb_schema loaded");
+ return LDB_ERR_CONSTRAINT_VIOLATION;
+ }
+
+ schema = dsdb_get_schema(module->ldb);
+ if (!schema) {
+ ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+ "%s: no dsdb_schema loaded",
+ fn_name);
+ return LDB_ERR_CONSTRAINT_VIOLATION;
+ }
+
+ partition_ctrl = get_control_from_list(req->controls, DSDB_CONTROL_CURRENT_PARTITION_OID);
+ if (!partition_ctrl) {
+ ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+ "%s: no current partition control found",
+ fn_name);
+ return LDB_ERR_CONSTRAINT_VIOLATION;
+ }
+
+ partition = talloc_get_type(partition_ctrl->data,
+ struct dsdb_control_current_partition);
+ if (!partition) {
+ ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+ "%s: current partition control contains invalid data",
+ fn_name);
+ return LDB_ERR_CONSTRAINT_VIOLATION;
+ }
+
+ if (partition->version != DSDB_CONTROL_CURRENT_PARTITION_VERSION) {
+ ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+ "%s: current partition control contains invalid version [%u != %u]\n",
+ fn_name, partition->version, DSDB_CONTROL_CURRENT_PARTITION_VERSION);
+ return LDB_ERR_CONSTRAINT_VIOLATION;
+ }
+
+ return fn(module, req, schema, partition);
+}
+
static int replmd_add_originating(struct ldb_module *module,
struct ldb_request *req,
const struct dsdb_schema *schema,
@@ -251,45 +309,8 @@ static int replmd_add_originating(struct ldb_module *module,
static int replmd_add(struct ldb_module *module, struct ldb_request *req)
{
- const struct dsdb_schema *schema;
- const struct ldb_control *partition_ctrl;
- const struct dsdb_control_current_partition *partition;
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.add.message->dn)) {
- return ldb_next_request(module, req);
- }
-
- schema = dsdb_get_schema(module->ldb);
- if (!schema) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_add: no dsdb_schema loaded");
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- partition_ctrl = get_control_from_list(req->controls, DSDB_CONTROL_CURRENT_PARTITION_OID);
- if (!partition_ctrl) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_add: no current partition control found");
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- partition = talloc_get_type(partition_ctrl->data,
- struct dsdb_control_current_partition);
- if (!partition) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_add: current partition control contains invalid data");
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- if (partition->version != DSDB_CONTROL_CURRENT_PARTITION_VERSION) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_add: current partition control contains invalid version [%u != %u]\n",
- partition->version, DSDB_CONTROL_CURRENT_PARTITION_VERSION);
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- return replmd_add_originating(module, req, schema, partition);
+ return replmd_prepare_originating(module, req, req->op.add.message->dn,
+ "replmd_add", replmd_add_originating);
}
static int replmd_modify_originating(struct ldb_module *module,
@@ -349,52 +370,8 @@ static int replmd_modify_originating(struct ldb_module *module,
static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
{
- const struct dsdb_schema *schema;
- const struct ldb_control *partition_ctrl;
- const struct dsdb_control_current_partition *partition;
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.mod.message->dn)) {
- return ldb_next_request(module, req);
- }
-
- schema = dsdb_get_schema(module->ldb);
- if (!schema) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_modify: no dsdb_schema loaded");
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- schema = dsdb_get_schema(module->ldb);
- if (!schema) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_modify: no dsdb_schema loaded");
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- partition_ctrl = get_control_from_list(req->controls, DSDB_CONTROL_CURRENT_PARTITION_OID);
- if (!partition_ctrl) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_modify: no current partition control found");
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- partition = talloc_get_type(partition_ctrl->data,
- struct dsdb_control_current_partition);
- if (!partition) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_modify: current partition control contains invalid data");
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- if (partition->version != DSDB_CONTROL_CURRENT_PARTITION_VERSION) {
- ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
- "replmd_modify: current partition control contains invalid version [%u != %u]\n",
- partition->version, DSDB_CONTROL_CURRENT_PARTITION_VERSION);
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- return replmd_modify_originating(module, req, schema, partition);
+ return replmd_prepare_originating(module, req, req->op.mod.message->dn,
+ "replmd_modify", replmd_modify_originating);
}
static int replmd_replicated_request_reply_helper(struct replmd_replicated_request *ar, int ret)