s4/drs: DsReplicaSync should search partition to Sync
authorKamen Mazdrashki <kamenim@samba.org>
Fri, 25 Jun 2010 01:34:42 +0000 (04:34 +0300)
committerKamen Mazdrashki <kamenim@samba.org>
Fri, 25 Jun 2010 01:51:59 +0000 (04:51 +0300)
by any valid DSName attribute given, be it - partition DN,
partition GUID or partition SID

source4/dsdb/repl/drepl_out_pull.c
source4/dsdb/repl/drepl_service.c

index 329b298d94b77f4f17846ecdd4b2ba17fdb83d79..c82b48dcbe641900db4ca997ac155f8f313afa22 100644 (file)
@@ -32,6 +32,7 @@
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "librpc/gen_ndr/ndr_drsblobs.h"
 #include "libcli/composite/composite.h"
+#include "libcli/security/dom_sid.h"
 
 WERROR dreplsrv_schedule_partition_pull_source(struct dreplsrv_service *s,
                                               struct dreplsrv_partition_source_dsa *source,
@@ -99,6 +100,34 @@ WERROR dreplsrv_schedule_partition_pull_by_guid(struct dreplsrv_service *s, TALL
        return WERR_NOT_FOUND;
 }
 
+/* force an immediate of the specified partition by Naming Context */
+WERROR dreplsrv_schedule_partition_pull_by_nc(struct dreplsrv_service *s, TALLOC_CTX *mem_ctx,
+                                             struct drsuapi_DsReplicaObjectIdentifier *nc)
+{
+       struct dreplsrv_partition *p;
+       bool valid_sid, valid_guid;
+       struct dom_sid null_sid;
+       ZERO_STRUCT(null_sid);
+
+       valid_sid  = !dom_sid_equal(&null_sid, &nc->sid);
+       valid_guid = !GUID_all_zero(&nc->guid);
+
+       if (!valid_sid && !valid_guid && !nc->dn) {
+               return WERR_DS_DRA_INVALID_PARAMETER;
+       }
+
+       for (p = s->partitions; p; p = p->next) {
+               if ((valid_guid && GUID_equal(&p->nc.guid, &nc->guid))
+                   || strequal(p->nc.dn, nc->dn)
+                   || (valid_sid && dom_sid_equal(&p->nc.sid, &nc->sid))) {
+                       return dreplsrv_schedule_partition_pull(s, p, mem_ctx);
+               }
+       }
+
+       return WERR_DS_DRA_BAD_NC;
+}
+
+
 static void dreplsrv_pending_op_callback(struct tevent_req *subreq)
 {
        struct dreplsrv_out_operation *op = tevent_req_callback_data(subreq,
index 59436d6c0c30645385f01e591e4f0ab3d90cd1b0..e48ae3e5630e9d76d505838c9b625d1c604ff21a 100644 (file)
@@ -110,16 +110,19 @@ static NTSTATUS drepl_replica_sync(struct irpc_message *msg,
 {
        struct dreplsrv_service *service = talloc_get_type(msg->private_data,
                                                           struct dreplsrv_service);
-       struct GUID *guid = &r->in.req->req1.naming_context->guid;
+       struct drsuapi_DsReplicaObjectIdentifier *nc = r->in.req->req1.naming_context;
 
-       r->out.result = dreplsrv_schedule_partition_pull_by_guid(service, msg, guid);
+       r->out.result = dreplsrv_schedule_partition_pull_by_nc(service, msg, nc);
        if (W_ERROR_IS_OK(r->out.result)) {
-               DEBUG(3,("drepl_replica_sync: forcing sync of partition %s\n",
-                        GUID_string(msg, guid)));
+               DEBUG(3,("drepl_replica_sync: forcing sync of partition (%s, %s)\n",
+                        GUID_string(msg, &nc->guid),
+                        nc->dn));
                dreplsrv_run_pending_ops(service);
        } else {
-               DEBUG(3,("drepl_replica_sync: failed setup of sync of partition %s - %s\n",
-                        GUID_string(msg, guid), win_errstr(r->out.result)));
+               DEBUG(3,("drepl_replica_sync: failed setup of sync of partition (%s, %s) - %s\n",
+                        GUID_string(msg, &nc->guid),
+                        nc->dn,
+                        win_errstr(r->out.result)));
        }
        return NT_STATUS_OK;
 }