[SCM] Samba Shared Repository - branch v3-3-test updated - release-3-2-0pre2-4424-ge96bcb7

Günther Deschner gd at samba.org
Wed Nov 19 00:56:28 GMT 2008


The branch, v3-3-test has been updated
       via  e96bcb7c2a49f95dee2a50adb1ed3ba77b1cbe07 (commit)
       via  a5f3bbbef1cdee91562e6f497cb612be78af7dd2 (commit)
       via  59b58d79af5aea62a6b7e60eb4b34141fd4d6356 (commit)
       via  a8fdca6963c4028ea8c65110945e78291f19031a (commit)
       via  7ab18764a88cb4ff555ce21b50d58a19ba47d540 (commit)
       via  1f239e17dd43667507b6b49006c9fe61c2cda289 (commit)
       via  c0c5dfbe4a305e18af69f094a25062cb222b7fd1 (commit)
       via  8aa7b1e4d8706bddb6da1b455f16484ca35fc17e (commit)
       via  eee6e2039b476c5bc257b1987335e250fd002e5c (commit)
       via  34eb55b9a8c83c739c1e3f540515e435b2b1a365 (commit)
       via  919f03a1755e6865a4d0edbdc50168355c03f346 (commit)
       via  fa381aa868ffd87f7d00b652163ffb50b6a967db (commit)
       via  2e6387771660a6b0e253decc269952bc5b80c477 (commit)
       via  4f954d550368e50e94b1f71fb9c151e393b06e6b (commit)
       via  65baa109ecf7a108fef471fa481bc91800c3f916 (commit)
       via  1c5a1843bd3e430c0e1c5a30d8995e8e43611809 (commit)
       via  8889173e7dbc7fb56e854640e60baae0c7477fa2 (commit)
       via  65b06a53d5fb82780363bbece04fb3e477d6c136 (commit)
       via  19f795312cc2e0e96bd447e84c9c996a5438bbe3 (commit)
       via  31f8238bcffa95cfeec078cae2c24b23df6eeb27 (commit)
       via  545849a208e0026f83ba6edc3515ccdbd9d74684 (commit)
       via  65f9b7c4a550a48daf42e5666defd5222a20fd27 (commit)
       via  bf1e5f5c58059ce468ab89a1dd069a96376284a3 (commit)
       via  95a5092ab672f55ccfa183bf9b989a215273b6b8 (commit)
       via  bea4ca30cb2fdcb72331a2f3648006b3d21e3407 (commit)
      from  c9b3bbdc3c36580dcb18a99ac58ae143b1926d8e (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test


- Log -----------------------------------------------------------------
commit e96bcb7c2a49f95dee2a50adb1ed3ba77b1cbe07
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 09:52:35 2008 +0100

    s3-libnet-samsync: store samsync sequence number state in keytab.
    
    Guenther

commit a5f3bbbef1cdee91562e6f497cb612be78af7dd2
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 09:49:37 2008 +0100

    s3-libnet-samsync: refactor libnet_samsync.
    
    Guenther

commit 59b58d79af5aea62a6b7e60eb4b34141fd4d6356
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 09:42:59 2008 +0100

    s3-libnet-samsync: pass back sequence number from fetch_sam_entries_keytab.
    
    Guenther

commit a8fdca6963c4028ea8c65110945e78291f19031a
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 03:45:38 2008 +0100

    s3-libnet-samsync: use netr_DatabaseDeltas unless full replication enforced.
    
    Guenther

commit 7ab18764a88cb4ff555ce21b50d58a19ba47d540
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 02:01:03 2008 +0100

    s3-libnet-samsync: pass sequence number pointer to process routine.
    
    Guenther

commit 1f239e17dd43667507b6b49006c9fe61c2cda289
Author: Günther Deschner <gd at samba.org>
Date:   Mon Nov 17 19:34:56 2008 +0100

    s3-libnet-samsync: move all modules to startup,process,finish callbacks.
    
    Guenther

commit c0c5dfbe4a305e18af69f094a25062cb222b7fd1
Author: Günther Deschner <gd at samba.org>
Date:   Mon Nov 17 17:14:19 2008 +0100

    s3-libnet-samsync: call init and close ops function where appropriate.
    
    Guenther

commit 8aa7b1e4d8706bddb6da1b455f16484ca35fc17e
Author: Günther Deschner <gd at samba.org>
Date:   Mon Nov 17 16:31:59 2008 +0100

    s3-libnet-samsync: use samsync_ops.
    
    Guenther

commit eee6e2039b476c5bc257b1987335e250fd002e5c
Author: Günther Deschner <gd at samba.org>
Date:   Mon Nov 17 16:29:11 2008 +0100

    s3-libnet-samsync: add samsync_ops to all samsync modules.
    
    Guenther

commit 34eb55b9a8c83c739c1e3f540515e435b2b1a365
Author: Günther Deschner <gd at samba.org>
Date:   Mon Nov 17 16:28:34 2008 +0100

    s3-libnet-samsync: add samsync_ops.
    
    Guenther

commit 919f03a1755e6865a4d0edbdc50168355c03f346
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 01:16:53 2008 +0100

    s3-libnet: move add_to_keytab_entries to libnet_keytab.
    
    Guenther

commit fa381aa868ffd87f7d00b652163ffb50b6a967db
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 13:25:50 2008 +0100

    s3-net: add "net rpc vampire passdb" that allows to take arguments.
    
    Guenther

commit 2e6387771660a6b0e253decc269952bc5b80c477
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 11 19:00:26 2008 +0100

    s3-net: use net_scan_dc in net rpc vampire keytab.
    
    Guenther

commit 4f954d550368e50e94b1f71fb9c151e393b06e6b
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 11 18:59:57 2008 +0100

    s3-net: add net_scan_dc function.
    
    Guenther

commit 65baa109ecf7a108fef471fa481bc91800c3f916
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 11 18:59:21 2008 +0100

    s3-net: add net_dc_info struct.
    
    Guenther

commit 1c5a1843bd3e430c0e1c5a30d8995e8e43611809
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 4 16:25:40 2008 +0100

    s3-net-vampire: add support for partial replication (individual deltas).
    
    Guenther

commit 8889173e7dbc7fb56e854640e60baae0c7477fa2
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 4 15:49:27 2008 +0100

    s3-libnet-samsync: add support for partial replication.
    
    Guenther

commit 65b06a53d5fb82780363bbece04fb3e477d6c136
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 23:50:02 2008 +0100

    re-run make idl.
    
    Guenther

commit 19f795312cc2e0e96bd447e84c9c996a5438bbe3
Author: Günther Deschner <gd at samba.org>
Date:   Thu Nov 6 16:50:39 2008 +0100

    netlogon: use 8bit SamDatabaseID and DeltaEnum in netr_ChangeLogEntry.
    
    Guenther

commit 31f8238bcffa95cfeec078cae2c24b23df6eeb27
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 18 23:43:09 2008 +0100

    netlogon: add 8bit varients of netr_SamDatabaseID8Bit and netr_DeltaEnum.
    
    Guenther

commit 545849a208e0026f83ba6edc3515ccdbd9d74684
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 4 11:35:48 2008 +0100

    netlogon-idl: use netr_ChangeLogEntry subcontext in netr_DatabaseRedo.
    
    Guenther

commit 65f9b7c4a550a48daf42e5666defd5222a20fd27
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 4 11:34:35 2008 +0100

    netlogon-idl: add netr_ChangeLogObject union.
    
    Guenther

commit bf1e5f5c58059ce468ab89a1dd069a96376284a3
Author: Günther Deschner <gd at samba.org>
Date:   Mon Nov 3 13:38:20 2008 +0100

    netlogon-idl: add netr_ChangeLogFlags.
    
    Guenther

commit 95a5092ab672f55ccfa183bf9b989a215273b6b8
Author: Günther Deschner <gd at samba.org>
Date:   Thu Oct 30 10:54:25 2008 +0100

    netlogon-idl: add netr_ChangeLogEntry.
    
    Guenther

commit bea4ca30cb2fdcb72331a2f3648006b3d21e3407
Author: Günther Deschner <gd at samba.org>
Date:   Thu Oct 30 09:29:17 2008 +0100

    netlogon: fix IDL for netr_DatabaseRedo.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source/Makefile.in                     |    3 +-
 source/libnet/libnet_dssync_keytab.c   |  111 +++++---------
 source/libnet/libnet_keytab.c          |   33 ++++
 source/libnet/libnet_proto.h           |    7 +
 source/libnet/libnet_samsync.c         |  200 ++++++++++++++++++++----
 source/libnet/libnet_samsync.h         |   65 +++++---
 source/libnet/libnet_samsync_display.c |   17 ++-
 source/libnet/libnet_samsync_keytab.c  |  221 +++++++++++++++++++-------
 source/libnet/libnet_samsync_ldif.c    |  119 ++++++++++----
 source/libnet/libnet_samsync_passdb.c  |   14 +-
 source/librpc/gen_ndr/cli_netlogon.c   |    8 +-
 source/librpc/gen_ndr/cli_netlogon.h   |    8 +-
 source/librpc/gen_ndr/misc.h           |    3 +
 source/librpc/gen_ndr/ndr_netlogon.c   |  275 +++++++++++++++++++++++++++----
 source/librpc/gen_ndr/ndr_netlogon.h   |    7 +
 source/librpc/gen_ndr/netlogon.h       |   33 ++++-
 source/librpc/gen_ndr/srv_netlogon.c   |    2 +-
 source/librpc/idl/misc.idl             |    3 +
 source/librpc/idl/netlogon.idl         |   36 ++++-
 source/librpc/ndr/ndr_netlogon.c       |   64 ++++++++
 source/librpc/ndr/ndr_netlogon.h       |   28 ++++
 source/utils/net.h                     |   10 ++
 source/utils/net_proto.h               |    5 +
 source/utils/net_rpc.c                 |    8 +
 source/utils/net_rpc_samsync.c         |  165 ++++++++++++++++++--
 source/utils/net_util.c                |   38 +++++
 26 files changed, 1188 insertions(+), 295 deletions(-)
 create mode 100644 source/librpc/ndr/ndr_netlogon.c
 create mode 100644 source/librpc/ndr/ndr_netlogon.h


Changeset truncated at 500 lines:

diff --git a/source/Makefile.in b/source/Makefile.in
index 9df43e6..a5af0b2 100644
--- a/source/Makefile.in
+++ b/source/Makefile.in
@@ -280,7 +280,8 @@ RPCCLIENT_NDR_OBJ = rpc_client/ndr.o
 LIBNDR_GEN_OBJ0 = librpc/gen_ndr/ndr_samr.o \
 		  librpc/gen_ndr/ndr_lsa.o
 
-LIBNDR_GEN_OBJ1 = librpc/gen_ndr/ndr_netlogon.o
+LIBNDR_GEN_OBJ1 = librpc/gen_ndr/ndr_netlogon.o \
+		  librpc/ndr/ndr_netlogon.o
 
 LIBNDR_GEN_OBJ = librpc/gen_ndr/ndr_wkssvc.o \
 		 $(LIBNDR_GEN_OBJ0) \
diff --git a/source/libnet/libnet_dssync_keytab.c b/source/libnet/libnet_dssync_keytab.c
index 6ba2c3a..3bd40dc 100644
--- a/source/libnet/libnet_dssync_keytab.c
+++ b/source/libnet/libnet_dssync_keytab.c
@@ -24,39 +24,6 @@
 
 #if defined(HAVE_ADS) && defined(ENCTYPE_ARCFOUR_HMAC)
 
-/**
- * Internal helper function to add data to the list
- * of keytab entries. It builds the prefix from the input.
- */
-static NTSTATUS add_to_keytab_entries(TALLOC_CTX *mem_ctx,
-				      struct libnet_keytab_context *ctx,
-				      uint32_t kvno,
-				      const char *name,
-				      const char *prefix,
-				      const krb5_enctype enctype,
-				      DATA_BLOB blob)
-{
-	struct libnet_keytab_entry entry;
-
-	entry.kvno = kvno;
-	entry.name = talloc_strdup(mem_ctx, name);
-	entry.principal = talloc_asprintf(mem_ctx, "%s%s%s@%s",
-					  prefix ? prefix : "",
-					  prefix ? "/" : "",
-					  name, ctx->dns_domain_name);
-	entry.enctype = enctype;
-	entry.password = blob;
-	NT_STATUS_HAVE_NO_MEMORY(entry.name);
-	NT_STATUS_HAVE_NO_MEMORY(entry.principal);
-	NT_STATUS_HAVE_NO_MEMORY(entry.password.data);
-
-	ADD_TO_ARRAY(mem_ctx, struct libnet_keytab_entry, entry,
-		     &ctx->entries, &ctx->count);
-	NT_STATUS_HAVE_NO_MEMORY(ctx->entries);
-
-	return NT_STATUS_OK;
-}
-
 static NTSTATUS keytab_startup(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
 			       struct replUpToDateVectorBlob **pold_utdv)
 {
@@ -134,10 +101,10 @@ static NTSTATUS keytab_finish(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
 			goto done;
 		}
 
-		status = add_to_keytab_entries(mem_ctx, keytab_ctx, 0,
-					       ctx->nc_dn, "UTDV",
-					       ENCTYPE_NULL,
-					       blob);
+		status = libnet_keytab_add_to_keytab_entries(mem_ctx, keytab_ctx, 0,
+							     ctx->nc_dn, "UTDV",
+							     ENCTYPE_NULL,
+							     blob);
 		if (!NT_STATUS_IS_OK(status)) {
 			goto done;
 		}
@@ -391,11 +358,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 	}
 
 	if (name) {
-		status = add_to_keytab_entries(mem_ctx, ctx, 0, object_dn,
-					       "SAMACCOUNTNAME",
-					       ENCTYPE_NULL,
-					       data_blob_talloc(mem_ctx, name,
-							strlen(name) + 1));
+		status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, 0, object_dn,
+							     "SAMACCOUNTNAME",
+							     ENCTYPE_NULL,
+							     data_blob_talloc(mem_ctx, name,
+							     strlen(name) + 1));
 		if (!NT_STATUS_IS_OK(status)) {
 			return status;
 		}
@@ -454,9 +421,9 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 	}
 	DEBUGADD(1,("\n"));
 
-	status = add_to_keytab_entries(mem_ctx, ctx, kvno, name, NULL,
-				       ENCTYPE_ARCFOUR_HMAC,
-				       data_blob_talloc(mem_ctx, nt_passwd, 16));
+	status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno, name, NULL,
+						     ENCTYPE_ARCFOUR_HMAC,
+						     data_blob_talloc(mem_ctx, nt_passwd, 16));
 
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
@@ -469,11 +436,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 			if (!pkb4->keys[i].value) {
 				continue;
 			}
-			status = add_to_keytab_entries(mem_ctx, ctx, kvno,
-						       name,
-						       NULL,
-						       pkb4->keys[i].keytype,
-						       *pkb4->keys[i].value);
+			status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno,
+								     name,
+								     NULL,
+								     pkb4->keys[i].keytype,
+								     *pkb4->keys[i].value);
 			if (!NT_STATUS_IS_OK(status)) {
 				return status;
 			}
@@ -482,11 +449,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 			if (!pkb4->old_keys[i].value) {
 				continue;
 			}
-			status = add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
-						       name,
-						       NULL,
-						       pkb4->old_keys[i].keytype,
-						       *pkb4->old_keys[i].value);
+			status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
+								     name,
+								     NULL,
+								     pkb4->old_keys[i].keytype,
+								     *pkb4->old_keys[i].value);
 			if (!NT_STATUS_IS_OK(status)) {
 				return status;
 			}
@@ -495,11 +462,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 			if (!pkb4->older_keys[i].value) {
 				continue;
 			}
-			status = add_to_keytab_entries(mem_ctx, ctx, kvno - 2,
-						       name,
-						       NULL,
-						       pkb4->older_keys[i].keytype,
-						       *pkb4->older_keys[i].value);
+			status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno - 2,
+								     name,
+								     NULL,
+								     pkb4->older_keys[i].keytype,
+								     *pkb4->older_keys[i].value);
 			if (!NT_STATUS_IS_OK(status)) {
 				return status;
 			}
@@ -511,10 +478,10 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 			if (!pkb3->keys[i].value) {
 				continue;
 			}
-			status = add_to_keytab_entries(mem_ctx, ctx, kvno, name,
-						       NULL,
-						       pkb3->keys[i].keytype,
-						       *pkb3->keys[i].value);
+			status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno, name,
+								     NULL,
+								     pkb3->keys[i].keytype,
+								     *pkb3->keys[i].value);
 			if (!NT_STATUS_IS_OK(status)) {
 				return status;
 			}
@@ -523,11 +490,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 			if (!pkb3->old_keys[i].value) {
 				continue;
 			}
-			status = add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
-						       name,
-						       NULL,
-						       pkb3->old_keys[i].keytype,
-						       *pkb3->old_keys[i].value);
+			status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
+								     name,
+								     NULL,
+								     pkb3->old_keys[i].keytype,
+								     *pkb3->old_keys[i].value);
 			if (!NT_STATUS_IS_OK(status)) {
 				return status;
 			}
@@ -549,9 +516,9 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 	}
 
 	for (; i<pwd_history_len; i++) {
-		status = add_to_keytab_entries(mem_ctx, ctx, kvno--, name, NULL,
-				ENCTYPE_ARCFOUR_HMAC,
-				data_blob_talloc(mem_ctx, &pwd_history[i*16], 16));
+		status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno--, name, NULL,
+							     ENCTYPE_ARCFOUR_HMAC,
+							     data_blob_talloc(mem_ctx, &pwd_history[i*16], 16));
 		if (!NT_STATUS_IS_OK(status)) {
 			break;
 		}
diff --git a/source/libnet/libnet_keytab.c b/source/libnet/libnet_keytab.c
index 46c17b2..990f6f6 100644
--- a/source/libnet/libnet_keytab.c
+++ b/source/libnet/libnet_keytab.c
@@ -401,4 +401,37 @@ cont:
 	return entry;
 }
 
+/**
+ * Helper function to add data to the list
+ * of keytab entries. It builds the prefix from the input.
+ */
+NTSTATUS libnet_keytab_add_to_keytab_entries(TALLOC_CTX *mem_ctx,
+					     struct libnet_keytab_context *ctx,
+					     uint32_t kvno,
+					     const char *name,
+					     const char *prefix,
+					     const krb5_enctype enctype,
+					     DATA_BLOB blob)
+{
+	struct libnet_keytab_entry entry;
+
+	entry.kvno = kvno;
+	entry.name = talloc_strdup(mem_ctx, name);
+	entry.principal = talloc_asprintf(mem_ctx, "%s%s%s@%s",
+					  prefix ? prefix : "",
+					  prefix ? "/" : "",
+					  name, ctx->dns_domain_name);
+	entry.enctype = enctype;
+	entry.password = blob;
+	NT_STATUS_HAVE_NO_MEMORY(entry.name);
+	NT_STATUS_HAVE_NO_MEMORY(entry.principal);
+	NT_STATUS_HAVE_NO_MEMORY(entry.password.data);
+
+	ADD_TO_ARRAY(mem_ctx, struct libnet_keytab_entry, entry,
+		     &ctx->entries, &ctx->count);
+	NT_STATUS_HAVE_NO_MEMORY(ctx->entries);
+
+	return NT_STATUS_OK;
+}
+
 #endif /* HAVE_KRB5 */
diff --git a/source/libnet/libnet_proto.h b/source/libnet/libnet_proto.h
index 69a16c1..9a193b7 100644
--- a/source/libnet/libnet_proto.h
+++ b/source/libnet/libnet_proto.h
@@ -55,6 +55,13 @@ struct libnet_keytab_entry *libnet_keytab_search(struct libnet_keytab_context *c
 						 const char *principal, int kvno,
 						 const krb5_enctype enctype,
 						 TALLOC_CTX *mem_ctx);
+NTSTATUS libnet_keytab_add_to_keytab_entries(TALLOC_CTX *mem_ctx,
+					     struct libnet_keytab_context *ctx,
+					     uint32_t kvno,
+					     const char *name,
+					     const char *prefix,
+					     const krb5_enctype enctype,
+					     DATA_BLOB blob);
 #endif
 
 /* The following definitions come from libnet/libnet_samsync.c  */
diff --git a/source/libnet/libnet_samsync.c b/source/libnet/libnet_samsync.c
index ad1b20a..7b264c5 100644
--- a/source/libnet/libnet_samsync.c
+++ b/source/libnet/libnet_samsync.c
@@ -282,47 +282,112 @@ static const char *samsync_debug_str(TALLOC_CTX *mem_ctx,
  * libnet_samsync
  */
 
-NTSTATUS libnet_samsync(enum netr_SamDatabaseID database_id,
-			struct samsync_context *ctx)
+void libnet_init_netr_ChangeLogEntry(struct samsync_object *o,
+				     struct netr_ChangeLogEntry *e)
+{
+	ZERO_STRUCTP(e);
+
+	e->db_index		= o->database_id;
+	e->delta_type		= o->object_type;
+
+	switch (e->delta_type) {
+		case NETR_DELTA_DOMAIN:
+		case NETR_DELTA_DELETE_GROUP:
+		case NETR_DELTA_RENAME_GROUP:
+		case NETR_DELTA_DELETE_USER:
+		case NETR_DELTA_RENAME_USER:
+		case NETR_DELTA_DELETE_ALIAS:
+		case NETR_DELTA_RENAME_ALIAS:
+		case NETR_DELTA_DELETE_TRUST:
+		case NETR_DELTA_DELETE_ACCOUNT:
+		case NETR_DELTA_DELETE_SECRET:
+		case NETR_DELTA_DELETE_GROUP2:
+		case NETR_DELTA_DELETE_USER2:
+		case NETR_DELTA_MODIFY_COUNT:
+			break;
+		case NETR_DELTA_USER:
+		case NETR_DELTA_GROUP:
+		case NETR_DELTA_GROUP_MEMBER:
+		case NETR_DELTA_ALIAS:
+		case NETR_DELTA_ALIAS_MEMBER:
+			e->object_rid = o->object_identifier.rid;
+			break;
+		case NETR_DELTA_SECRET:
+			e->object.object_name = o->object_identifier.name;
+			e->flags = NETR_CHANGELOG_NAME_INCLUDED;
+			break;
+		case NETR_DELTA_TRUSTED_DOMAIN:
+		case NETR_DELTA_ACCOUNT:
+		case NETR_DELTA_POLICY:
+			e->object.object_sid = o->object_identifier.sid;
+			e->flags = NETR_CHANGELOG_SID_INCLUDED;
+			break;
+		default:
+			break;
+	}
+}
+
+/**
+ * libnet_samsync_delta
+ */
+
+static NTSTATUS libnet_samsync_delta(TALLOC_CTX *mem_ctx,
+				     enum netr_SamDatabaseID database_id,
+				     uint64_t *sequence_num,
+				     struct samsync_context *ctx,
+				     struct netr_ChangeLogEntry *e)
 {
 	NTSTATUS result;
-	TALLOC_CTX *mem_ctx;
+	NTSTATUS callback_status;
 	const char *logon_server = ctx->cli->desthost;
 	const char *computername = global_myname();
 	struct netr_Authenticator credential;
 	struct netr_Authenticator return_authenticator;
 	uint16_t restart_state = 0;
 	uint32_t sync_context = 0;
-	const char *debug_str;
 	DATA_BLOB session_key;
 
 	ZERO_STRUCT(return_authenticator);
 
-	if (!(mem_ctx = talloc_init("libnet_samsync"))) {
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	debug_str = samsync_debug_str(mem_ctx, ctx->mode, database_id);
-	if (debug_str) {
-		d_fprintf(stderr, "%s\n", debug_str);
-	}
-
 	do {
 		struct netr_DELTA_ENUM_ARRAY *delta_enum_array = NULL;
-		NTSTATUS callback_status;
 
 		netlogon_creds_client_step(ctx->cli->dc, &credential);
 
-		result = rpccli_netr_DatabaseSync2(ctx->cli, mem_ctx,
-						   logon_server,
-						   computername,
-						   &credential,
-						   &return_authenticator,
-						   database_id,
-						   restart_state,
-						   &sync_context,
-						   &delta_enum_array,
-						   0xffff);
+		if (ctx->single_object_replication &&
+		    !ctx->force_full_replication) {
+			result = rpccli_netr_DatabaseRedo(ctx->cli, mem_ctx,
+							  logon_server,
+							  computername,
+							  &credential,
+							  &return_authenticator,
+							  *e,
+							  0,
+							  &delta_enum_array);
+		} else if (!ctx->force_full_replication &&
+		           sequence_num && (*sequence_num > 0)) {
+			result = rpccli_netr_DatabaseDeltas(ctx->cli, mem_ctx,
+							    logon_server,
+							    computername,
+							    &credential,
+							    &return_authenticator,
+							    database_id,
+							    sequence_num,
+							    &delta_enum_array,
+							    0xffff);
+		} else {
+			result = rpccli_netr_DatabaseSync2(ctx->cli, mem_ctx,
+							   logon_server,
+							   computername,
+							   &credential,
+							   &return_authenticator,
+							   database_id,
+							   restart_state,
+							   &sync_context,
+							   &delta_enum_array,
+							   0xffff);
+		}
+
 		if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_SUPPORTED)) {
 			return result;
 		}
@@ -346,9 +411,10 @@ NTSTATUS libnet_samsync(enum netr_SamDatabaseID database_id,
 					delta_enum_array);
 
 		/* Process results */
-		callback_status = ctx->delta_fn(mem_ctx, database_id,
-						delta_enum_array,
-						NT_STATUS_IS_OK(result), ctx);
+		callback_status = ctx->ops->process_objects(mem_ctx, database_id,
+							    delta_enum_array,
+							    sequence_num,
+							    ctx);
 		if (!NT_STATUS_IS_OK(callback_status)) {
 			result = callback_status;
 			goto out;
@@ -362,14 +428,86 @@ NTSTATUS libnet_samsync(enum netr_SamDatabaseID database_id,
 	} while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES));
 
  out:
-	if (NT_STATUS_IS_ERR(result) && !ctx->error_message) {
+
+	return result;
+}
+
+/**
+ * libnet_samsync
+ */
+
+NTSTATUS libnet_samsync(enum netr_SamDatabaseID database_id,
+			struct samsync_context *ctx)
+{
+	NTSTATUS status = NT_STATUS_OK;
+	NTSTATUS callback_status;
+	TALLOC_CTX *mem_ctx;
+	const char *debug_str;
+	uint64_t sequence_num = 0;
+	int i = 0;
+
+	if (!(mem_ctx = talloc_new(ctx))) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	if (!ctx->ops) {
+		return NT_STATUS_INVALID_PARAMETER;
+	}
+
+	if (ctx->ops->startup) {
+		status = ctx->ops->startup(mem_ctx, ctx,
+					   database_id, &sequence_num);
+		if (!NT_STATUS_IS_OK(status)) {
+			goto done;
+		}
+	}
+
+	debug_str = samsync_debug_str(mem_ctx, ctx->mode, database_id);
+	if (debug_str) {
+		d_fprintf(stderr, "%s\n", debug_str);
+	}
+
+	if (!ctx->single_object_replication) {
+		status = libnet_samsync_delta(mem_ctx, database_id,
+					      &sequence_num, ctx, NULL);
+		goto done;
+	}
+
+	for (i=0; i<ctx->num_objects; i++) {
+
+		struct netr_ChangeLogEntry e;
+
+		if (ctx->objects[i].database_id != database_id) {
+			continue;
+		}
+
+		libnet_init_netr_ChangeLogEntry(&ctx->objects[i], &e);
+
+		status = libnet_samsync_delta(mem_ctx, database_id,
+					      &sequence_num, ctx, &e);
+		if (!NT_STATUS_IS_OK(status)) {
+			goto done;
+		}
+	}
+
+ done:
+
+	if (NT_STATUS_IS_OK(status) && ctx->ops->finish) {
+		callback_status = ctx->ops->finish(mem_ctx, ctx,
+						   database_id, sequence_num);
+		if (!NT_STATUS_IS_OK(callback_status)) {
+			status = callback_status;
+		}
+	}
+
+	if (NT_STATUS_IS_ERR(status) && !ctx->error_message) {
 
 		ctx->error_message = talloc_asprintf(ctx,
 			"Failed to fetch %s database: %s",
 			samsync_database_str(database_id),
-			nt_errstr(result));
+			nt_errstr(status));
 
-		if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_SUPPORTED)) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list