summaryrefslogtreecommitdiff
path: root/source4/dsdb
diff options
context:
space:
mode:
Diffstat (limited to 'source4/dsdb')
-rw-r--r--source4/dsdb/samdb/ldb_modules/repl_meta_data.c95
-rw-r--r--source4/dsdb/samdb/ldb_modules/samldb.c5
-rw-r--r--source4/dsdb/samdb/samdb.h5
3 files changed, 88 insertions, 17 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index d9ad9d6e51..171af52eda 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -40,8 +40,11 @@
*/
#include "includes.h"
-#include "ldb/include/includes.h"
+#include "lib/ldb/include/ldb.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "lib/ldb/include/ldb_private.h"
#include "librpc/gen_ndr/ndr_misc.h"
+#include "dsdb/samdb/samdb.h"
static struct ldb_message_element *replmd_find_attribute(const struct ldb_message *msg, const char *name)
{
@@ -108,8 +111,24 @@ static int add_uint64_element(struct ldb_message *msg, const char *attr, uint64_
return 0;
}
-/* add_record: add objectGUID attribute */
-static int replmd_add(struct ldb_module *module, struct ldb_request *req)
+static int replmd_add_replicated(struct ldb_module *module, struct ldb_request *req, struct ldb_control *ctrl)
+{
+ struct ldb_control **saved_ctrls;
+ int ret;
+
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_add_replicated\n");
+
+ if (!save_controls(ctrl, req, &saved_ctrls)) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+
+ ret = ldb_next_request(module, req);
+ req->controls = saved_ctrls;
+
+ return ret;
+}
+
+static int replmd_add_originating(struct ldb_module *module, struct ldb_request *req)
{
struct ldb_request *down_req;
struct ldb_message_element *attribute;
@@ -121,12 +140,7 @@ static int replmd_add(struct ldb_module *module, struct ldb_request *req)
int ret;
time_t t = time(NULL);
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_add_record\n");
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.add.message->dn)) {
- return ldb_next_request(module, req);
- }
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_add_originating\n");
if ((attribute = replmd_find_attribute(req->op.add.message, "objectGUID")) != NULL ) {
return ldb_next_request(module, req);
@@ -192,8 +206,42 @@ static int replmd_add(struct ldb_module *module, struct ldb_request *req)
return ret;
}
-/* modify_record: update timestamps */
-static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
+static int replmd_add(struct ldb_module *module, struct ldb_request *req)
+{
+ struct ldb_control *ctrl;
+
+ /* do not manipulate our control entries */
+ if (ldb_dn_is_special(req->op.add.message->dn)) {
+ return ldb_next_request(module, req);
+ }
+
+ ctrl = get_control_from_list(req->controls, DSDB_CONTROL_REPLICATED_OBJECT_OID);
+ if (ctrl) {
+ /* handle replicated objects different */
+ return replmd_add_replicated(module, req, ctrl);
+ }
+
+ return replmd_add_originating(module, req);
+}
+
+static int replmd_modify_replicated(struct ldb_module *module, struct ldb_request *req, struct ldb_control *ctrl)
+{
+ struct ldb_control **saved_ctrls;
+ int ret;
+
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_modify_replicated\n");
+
+ if (!save_controls(ctrl, req, &saved_ctrls)) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+
+ ret = ldb_next_request(module, req);
+ req->controls = saved_ctrls;
+
+ return ret;
+}
+
+static int replmd_modify_originating(struct ldb_module *module, struct ldb_request *req)
{
struct ldb_request *down_req;
struct ldb_message *msg;
@@ -201,12 +249,7 @@ static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
time_t t = time(NULL);
uint64_t seq_num;
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_modify\n");
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.add.message->dn)) {
- return ldb_next_request(module, req);
- }
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_modify_originating\n");
down_req = talloc(req, struct ldb_request);
if (down_req == NULL) {
@@ -250,6 +293,24 @@ static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
return ret;
}
+static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
+{
+ struct ldb_control *ctrl;
+
+ /* do not manipulate our control entries */
+ if (ldb_dn_is_special(req->op.mod.message->dn)) {
+ return ldb_next_request(module, req);
+ }
+
+ ctrl = get_control_from_list(req->controls, DSDB_CONTROL_REPLICATED_OBJECT_OID);
+ if (ctrl) {
+ /* handle replicated objects different */
+ return replmd_modify_replicated(module, req, ctrl);
+ }
+
+ return replmd_modify_originating(module, req);
+}
+
static const struct ldb_module_ops replmd_ops = {
.name = "repl_meta_data",
.add = replmd_add,
diff --git a/source4/dsdb/samdb/ldb_modules/samldb.c b/source4/dsdb/samdb/ldb_modules/samldb.c
index 1c1ff0ea6e..07d77ee3fc 100644
--- a/source4/dsdb/samdb/ldb_modules/samldb.c
+++ b/source4/dsdb/samdb/ldb_modules/samldb.c
@@ -680,6 +680,11 @@ static int samldb_add(struct ldb_module *module, struct ldb_request *req)
return ldb_next_request(module, req);
}
+ if (get_control_from_list(req->controls, DSDB_CONTROL_REPLICATED_OBJECT_OID)) {
+ /* if it's a replicated object we have nothing to do */
+ return ldb_next_request(module, req);
+ }
+
/* is user or computer? */
if ((samdb_find_attribute(module->ldb, msg, "objectclass", "user") != NULL) ||
(samdb_find_attribute(module->ldb, msg, "objectclass", "computer") != NULL)) {
diff --git a/source4/dsdb/samdb/samdb.h b/source4/dsdb/samdb/samdb.h
index 8ff44f7554..7d16b2d380 100644
--- a/source4/dsdb/samdb/samdb.h
+++ b/source4/dsdb/samdb/samdb.h
@@ -29,6 +29,11 @@ struct drsuapi_DsReplicaObject;
struct drsuapi_DsReplicaOIDMapping_Ctr;
struct drsuapi_DsReplicaAttribute;
+#define DSDB_CONTROL_REPLICATED_OBJECT_OID "1.3.6.1.4.1.7165.4.3.1"
+struct dsdb_control_replicated_object {
+ uint8_t __dummy;
+};
+
#include "librpc/gen_ndr/security.h"
#include "lib/ldb/include/ldb.h"
#include "librpc/gen_ndr/samr.h"