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

Günther Deschner gd at samba.org
Fri Jun 13 21:46:29 GMT 2008


The branch, v3-3-test has been updated
       via  cf382a87602a63368587ffa2c95b774f2f97c21b (commit)
       via  94d45b1bb97ac2b6025d429389993ac43044f5b8 (commit)
       via  bcc6d3a0ebdcb904b5a2a4de63d9ed7415e9bb33 (commit)
       via  63ca4414b62657983c27d2930483aa56f9c78ccf (commit)
       via  bbfe5bcaf5ec5d06ffd110ab362ea3f228867603 (commit)
       via  9557504d70fe57098914da131b39212faf4f0a7d (commit)
       via  ae179e4f3faccbf2c9f19b6f070f5daf87cdfc50 (commit)
       via  e9b79f34d5afe10ee8d9b1e2dd19c8aafa533579 (commit)
       via  0707d32042b23d615b57b2f955775472b766770e (commit)
       via  b5a0e2d18f8d5c98326fefbda5972c02f898ed82 (commit)
      from  f30bc6503de6c712101e04fe26c004eeffcd300e (commit)

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


- Log -----------------------------------------------------------------
commit cf382a87602a63368587ffa2c95b774f2f97c21b
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jun 13 22:33:46 2008 +0200

    net_vampire: rename process_database to samsync_process_database.
    
    Guenther

commit 94d45b1bb97ac2b6025d429389993ac43044f5b8
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jun 13 21:57:32 2008 +0200

    net_vampire: fix ldif_init_context().
    
    Guenther

commit bcc6d3a0ebdcb904b5a2a4de63d9ed7415e9bb33
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jun 13 21:46:59 2008 +0200

    net_vampire: split out rpc_vampire_ldif().
    
    Guenther

commit 63ca4414b62657983c27d2930483aa56f9c78ccf
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jun 13 21:25:53 2008 +0200

    net_vampire: add samsync_init_context().
    
    Guenther

commit bbfe5bcaf5ec5d06ffd110ab362ea3f228867603
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jun 13 21:11:55 2008 +0200

    net_vampire: add samsync_debug_str().
    
    Guenther

commit 9557504d70fe57098914da131b39212faf4f0a7d
Author: Günther Deschner <gd at samba.org>
Date:   Thu Jun 12 12:35:46 2008 +0200

    net_vampire: restructure internal code more.
    
    Guenther

commit ae179e4f3faccbf2c9f19b6f070f5daf87cdfc50
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 11 02:29:58 2008 +0200

    net_vampire: start using talloc for the ldif vampire code.
    
    Guenther

commit e9b79f34d5afe10ee8d9b1e2dd19c8aafa533579
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 11 01:46:58 2008 +0200

    net_vampire: join dump and process function into one callback.
    
    Guenther

commit 0707d32042b23d615b57b2f955775472b766770e
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 11 01:29:36 2008 +0200

    net_vampire: let fetch_database and fetch_database_to_ldif use sid pointers.
    
    Guenther

commit b5a0e2d18f8d5c98326fefbda5972c02f898ed82
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 11 01:23:43 2008 +0200

    net_vampire: let dump_database() return NTSTATUS.
    
    Guenther

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

Summary of changes:
 source/utils/net.h             |   42 ++-
 source/utils/net_proto.h       |    9 +
 source/utils/net_rpc.c         |   34 +-
 source/utils/net_rpc_samsync.c | 1197 +++++++++++++++++++++++-----------------
 4 files changed, 773 insertions(+), 509 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/utils/net.h b/source/utils/net.h
index 65c8d75..627ac0a 100644
--- a/source/utils/net.h
+++ b/source/utils/net.h
@@ -148,13 +148,43 @@ enum netdom_domain_t { ND_TYPE_NT4, ND_TYPE_AD };
 /* Structure for mapping accounts to groups */
 /* Array element is the group rid */
 typedef struct _groupmap {
-	uint32 rid;
-	uint32 gidNumber;
-	fstring sambaSID;
-	fstring group_dn;
+	uint32_t rid;
+	uint32_t gidNumber;
+	const char *sambaSID;
+	const char *group_dn;
 } GROUPMAP;
 
 typedef struct _accountmap {
-	uint32 rid;
-	fstring cn;
+	uint32_t rid;
+	const char *cn;
 } ACCOUNTMAP;
+
+enum net_samsync_mode {
+	NET_SAMSYNC_MODE_FETCH_PASSDB = 0,
+	NET_SAMSYNC_MODE_FETCH_LDIF = 1,
+	NET_SAMSYNC_MODE_DUMP = 2
+};
+
+struct samsync_ldif_context {
+	GROUPMAP *groupmap;
+	ACCOUNTMAP *accountmap;
+	bool initialized;
+	const char *add_template;
+	const char *mod_template;
+	char *add_name;
+	char *mod_name;
+	FILE *add_file;
+	FILE *mod_file;
+	FILE *ldif_file;
+	const char *suffix;
+	int num_alloced;
+};
+
+struct samsync_context {
+	enum net_samsync_mode mode;
+	const struct dom_sid *domain_sid;
+	const char *domain_sid_str;
+	const char *ldif_filename;
+
+	struct samsync_ldif_context *ldif;
+};
diff --git a/source/utils/net_proto.h b/source/utils/net_proto.h
index fe3b864..a370d3d 100644
--- a/source/utils/net_proto.h
+++ b/source/utils/net_proto.h
@@ -359,6 +359,15 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
 				TALLOC_CTX *mem_ctx,
 				int argc,
 				const char **argv);
+int rpc_vampire_ldif(struct net_context *c, int argc, const char **argv);
+NTSTATUS rpc_vampire_ldif_internals(struct net_context *c,
+				    const DOM_SID *domain_sid,
+				    const char *domain_name,
+				    struct cli_state *cli,
+				    struct rpc_pipe_client *pipe_hnd,
+				    TALLOC_CTX *mem_ctx,
+				    int argc,
+				    const char **argv);
 
 /* The following definitions come from utils/net_rpc_service.c  */
 
diff --git a/source/utils/net_rpc.c b/source/utils/net_rpc.c
index 25a4ef1..6a7c638 100644
--- a/source/utils/net_rpc.c
+++ b/source/utils/net_rpc.c
@@ -6807,16 +6807,34 @@ static int rpc_samdump(struct net_context *c, int argc, const char **argv) {
 }
 
 /* syncronise sam database via samsync rpc calls */
-static int rpc_vampire(struct net_context *c, int argc, const char **argv) {
-	if (c->display_usage) {
-		d_printf("Usage:\n"
-			 "net rpc vampire\n"
-			 "    Vampire remote SAM database\n");
-		return 0;
+static int rpc_vampire(struct net_context *c, int argc, const char **argv)
+{
+	struct functable func[] = {
+		{
+			"ldif",
+			rpc_vampire_ldif,
+			NET_TRANSPORT_RPC,
+			"Dump remote SAM database to ldif",
+			"net rpc vampire ldif\n"
+			"    Dump remote SAM database to LDIF file or stdout"
+		},
+		{NULL, NULL, 0, NULL, NULL}
+	};
+
+	if (argc == 0) {
+		if (c->display_usage) {
+			d_printf("Usage:\n"
+				 "net rpc vampire\n"
+				 "    Vampire remote SAM database\n");
+			return 0;
+		}
+
+		return run_rpc_command(c, NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS,
+				       rpc_vampire_internals,
+				       argc, argv);
 	}
 
-	return run_rpc_command(c, NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS,
-			       rpc_vampire_internals,  argc, argv);
+	return net_run_function(c, argc, argv, "net rpc vampire", func);
 }
 
 /**
diff --git a/source/utils/net_rpc_samsync.c b/source/utils/net_rpc_samsync.c
index 44c95f9..5343a04 100644
--- a/source/utils/net_rpc_samsync.c
+++ b/source/utils/net_rpc_samsync.c
@@ -29,8 +29,6 @@
 /* uid's and gid's for writing deltas to ldif */
 static uint32 ldif_gid = 999;
 static uint32 ldif_uid = 999;
-/* Keep track of ldap initialization */
-static int init_ldap = 1;
 
 static void display_group_mem_info(uint32_t rid,
 				   struct netr_DELTA_GROUP_MEMBER *r)
@@ -172,7 +170,11 @@ static void display_group_info(uint32_t rid, struct netr_DELTA_GROUP *r)
 	d_printf("desc='%s', rid=%u\n", r->description.string, rid);
 }
 
-static void display_sam_entry(struct netr_DELTA_ENUM *r)
+static NTSTATUS display_sam_entry(TALLOC_CTX *mem_ctx,
+				  enum netr_SamDatabaseID database_id,
+				  struct netr_DELTA_ENUM *r,
+				  NTSTATUS status,
+				  struct samsync_context *ctx)
 {
 	union netr_DELTA_UNION u = r->delta_union;
 	union netr_DELTA_ID_UNION id = r->delta_id_union;
@@ -322,42 +324,131 @@ static void display_sam_entry(struct netr_DELTA_ENUM *r)
 			r->delta_type);
 		break;
 	}
+
+	return NT_STATUS_OK;
 }
 
-static void dump_database(struct rpc_pipe_client *pipe_hnd,
-			  enum netr_SamDatabaseID database_id)
+static NTSTATUS display_sam_entries(TALLOC_CTX *mem_ctx,
+				    enum netr_SamDatabaseID database_id,
+				    struct netr_DELTA_ENUM_ARRAY *r,
+				    NTSTATUS status,
+				    struct samsync_context *ctx)
 {
-        NTSTATUS result;
 	int i;
-        TALLOC_CTX *mem_ctx;
+
+	for (i = 0; i < r->num_deltas; i++) {
+		display_sam_entry(mem_ctx, database_id, &r->delta_enum[i], status, ctx);
+	}
+
+	return NT_STATUS_OK;
+}
+
+static NTSTATUS samsync_init_context(TALLOC_CTX *mem_ctx,
+				     const struct dom_sid *domain_sid,
+				     enum net_samsync_mode mode,
+				     struct samsync_context **ctx_p)
+{
+	struct samsync_context *ctx;
+
+	*ctx_p = NULL;
+
+	ctx = TALLOC_ZERO_P(mem_ctx, struct samsync_context);
+	NT_STATUS_HAVE_NO_MEMORY(ctx);
+
+	ctx->mode = mode;
+
+	if (domain_sid) {
+		ctx->domain_sid = sid_dup_talloc(mem_ctx, domain_sid);
+		NT_STATUS_HAVE_NO_MEMORY(ctx->domain_sid);
+
+		ctx->domain_sid_str = sid_string_talloc(mem_ctx, ctx->domain_sid);
+		NT_STATUS_HAVE_NO_MEMORY(ctx->domain_sid_str);
+	}
+
+	*ctx_p = ctx;
+
+	return NT_STATUS_OK;
+}
+
+const char *samsync_debug_str(TALLOC_CTX *mem_ctx,
+			      enum net_samsync_mode mode,
+			      enum netr_SamDatabaseID database_id)
+{
+	const char *action = NULL;
+	const char *str = NULL;
+
+	switch (mode) {
+		case NET_SAMSYNC_MODE_DUMP:
+			action = "Dumping (to stdout)";
+			break;
+		case NET_SAMSYNC_MODE_FETCH_PASSDB:
+			action = "Fetching (to passdb)";
+			break;
+		case NET_SAMSYNC_MODE_FETCH_LDIF:
+			action = "Fetching (to ldif)";
+			break;
+		default:
+			action = "Unknown";
+			break;
+	}
+
+	switch (database_id) {
+		case SAM_DATABASE_DOMAIN:
+			str = talloc_asprintf(mem_ctx, "%s DOMAIN database",
+				action);
+			break;
+		case SAM_DATABASE_BUILTIN:
+			str = talloc_asprintf(mem_ctx, "%s BUILTIN database",
+				action);
+			break;
+		case SAM_DATABASE_PRIVS:
+			str = talloc_asprintf(mem_ctx, "%s PRIVS database",
+				action);
+			break;
+		default:
+			str = talloc_asprintf(mem_ctx, "%s unknown database type %u",
+				action, database_id);
+			break;
+	}
+
+	if (!str) {
+		return NULL;
+	}
+
+	return str;
+}
+
+typedef NTSTATUS (*samsync_fn_t)(TALLOC_CTX *,
+				 enum netr_SamDatabaseID,
+				 struct netr_DELTA_ENUM_ARRAY *,
+				 NTSTATUS,
+				 struct samsync_context *);
+
+static NTSTATUS samsync_process_database(struct rpc_pipe_client *pipe_hnd,
+					 enum netr_SamDatabaseID database_id,
+					 samsync_fn_t callback_fn,
+					 struct samsync_context *ctx)
+{
+	NTSTATUS result;
+	TALLOC_CTX *mem_ctx;
 	const char *logon_server = pipe_hnd->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("dump_database"))) {
-		return;
+	if (!(mem_ctx = talloc_init("samsync_process_database"))) {
+		return NT_STATUS_NO_MEMORY;
 	}
 
-	switch(database_id) {
-	case SAM_DATABASE_DOMAIN:
-		d_printf("Dumping DOMAIN database\n");
-		break;
-	case SAM_DATABASE_BUILTIN:
-		d_printf("Dumping BUILTIN database\n");
-		break;
-	case SAM_DATABASE_PRIVS:
-		d_printf("Dumping PRIVS databases\n");
-		break;
-	default:
-		d_printf("Dumping unknown database type %u\n",
-			database_id);
-		break;
+	debug_str = samsync_debug_str(mem_ctx, ctx->mode, database_id);
+	if (debug_str) {
+		d_fprintf(stderr, "%s\n", debug_str);
 	}
 
 	do {
@@ -375,12 +466,15 @@ static void dump_database(struct rpc_pipe_client *pipe_hnd,
 						   &sync_context,
 						   &delta_enum_array,
 						   0xffff);
+		if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_SUPPORTED)) {
+			return result;
+		}
 
 		/* Check returned credentials. */
 		if (!netlogon_creds_client_check(pipe_hnd->dc,
 						 &return_authenticator.cred)) {
 			DEBUG(0,("credentials chain check failed\n"));
-			return;
+			return NT_STATUS_ACCESS_DENIED;
 		}
 
 		if (NT_STATUS_IS_ERR(result)) {
@@ -395,16 +489,19 @@ static void dump_database(struct rpc_pipe_client *pipe_hnd,
 					database_id,
 					delta_enum_array);
 
-		/* Display results */
-		for (i = 0; i < delta_enum_array->num_deltas; i++) {
-			display_sam_entry(&delta_enum_array->delta_enum[i]);
-                }
+		/* Process results */
+		callback_fn(mem_ctx, database_id, delta_enum_array, result, ctx);
 
 		TALLOC_FREE(delta_enum_array);
 
+		/* Increment sync_context */
+		sync_context += 1;
+
 	} while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES));
 
 	talloc_destroy(mem_ctx);
+
+	return result;
 }
 
 /* dump sam database via samsync rpc calls */
@@ -417,9 +514,27 @@ NTSTATUS rpc_samdump_internals(struct net_context *c,
 				int argc,
 				const char **argv)
 {
-	dump_database(pipe_hnd, SAM_DATABASE_DOMAIN);
-	dump_database(pipe_hnd, SAM_DATABASE_BUILTIN);
-	dump_database(pipe_hnd, SAM_DATABASE_PRIVS);
+	struct samsync_context *ctx = NULL;
+	NTSTATUS status;
+
+	status = samsync_init_context(mem_ctx,
+				      domain_sid,
+				      NET_SAMSYNC_MODE_DUMP,
+				      &ctx);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	samsync_process_database(pipe_hnd, SAM_DATABASE_DOMAIN,
+				 display_sam_entries, ctx);
+
+	samsync_process_database(pipe_hnd, SAM_DATABASE_BUILTIN,
+				 display_sam_entries, ctx);
+
+	samsync_process_database(pipe_hnd, SAM_DATABASE_PRIVS,
+				 display_sam_entries, ctx);
+
+	TALLOC_FREE(ctx);
 
 	return NT_STATUS_OK;
 }
@@ -942,7 +1057,7 @@ static NTSTATUS fetch_group_mem_info(uint32_t rid,
 
 static NTSTATUS fetch_alias_info(uint32_t rid,
 				 struct netr_DELTA_ALIAS *r,
-				 DOM_SID dom_sid)
+				 const DOM_SID *dom_sid)
 {
 	fstring name;
 	fstring comment;
@@ -956,7 +1071,7 @@ static NTSTATUS fetch_alias_info(uint32_t rid,
 	fstrcpy(comment, r->description.string);
 
 	/* Find out whether the group is already mapped */
-	sid_copy(&alias_sid, &dom_sid);
+	sid_copy(&alias_sid, dom_sid);
 	sid_append_rid(&alias_sid, rid);
 	sid_to_fstring(sid_string, &alias_sid);
 
@@ -982,7 +1097,7 @@ static NTSTATUS fetch_alias_info(uint32_t rid,
 	map.gid = grp->gr_gid;
 	map.sid = alias_sid;
 
-	if (sid_equal(&dom_sid, &global_sid_Builtin))
+	if (sid_equal(dom_sid, &global_sid_Builtin))
 		map.sid_name_use = SID_NAME_WKN_GRP;
 	else
 		map.sid_name_use = SID_NAME_ALIAS;
@@ -1000,7 +1115,7 @@ static NTSTATUS fetch_alias_info(uint32_t rid,
 
 static NTSTATUS fetch_alias_mem(uint32_t rid,
 				struct netr_DELTA_ALIAS_MEMBER *r,
-				DOM_SID dom_sid)
+				const DOM_SID *dom_sid)
 {
 	return NT_STATUS_OK;
 }
@@ -1082,7 +1197,10 @@ static NTSTATUS fetch_domain_info(uint32_t rid,
 	return NT_STATUS_OK;
 }
 
-static void fetch_sam_entry(struct netr_DELTA_ENUM *r, DOM_SID dom_sid)
+static NTSTATUS fetch_sam_entry(TALLOC_CTX *mem_ctx,
+				enum netr_SamDatabaseID database_id,
+				struct netr_DELTA_ENUM *r,
+				struct samsync_context *ctx)
 {
 	switch(r->delta_type) {
 	case NETR_DELTA_USER:
@@ -1100,12 +1218,12 @@ static void fetch_sam_entry(struct netr_DELTA_ENUM *r, DOM_SID dom_sid)
 	case NETR_DELTA_ALIAS:
 		fetch_alias_info(r->delta_id_union.rid,
 				 r->delta_union.alias,
-				 dom_sid);
+				 ctx->domain_sid);
 		break;
 	case NETR_DELTA_ALIAS_MEMBER:
 		fetch_alias_mem(r->delta_id_union.rid,
 				r->delta_union.alias_member,
-				dom_sid);
+				ctx->domain_sid);
 		break;
 	case NETR_DELTA_DOMAIN:
 		fetch_domain_info(r->delta_id_union.rid,
@@ -1164,88 +1282,32 @@ static void fetch_sam_entry(struct netr_DELTA_ENUM *r, DOM_SID dom_sid)
 		d_printf("Unknown delta record type %d\n", r->delta_type);
 		break;
 	}
+
+	return NT_STATUS_OK;
 }
 
-static NTSTATUS fetch_database(struct rpc_pipe_client *pipe_hnd, uint32 db_type, DOM_SID dom_sid)
+static NTSTATUS fetch_sam_entries(TALLOC_CTX *mem_ctx,
+				  enum netr_SamDatabaseID database_id,
+				  struct netr_DELTA_ENUM_ARRAY *r,
+				  NTSTATUS status,
+				  struct samsync_context *ctx)
 {
-        NTSTATUS result;
 	int i;
-        TALLOC_CTX *mem_ctx;
-	const char *logon_server = pipe_hnd->desthost;
-	const char *computername = global_myname();
-	struct netr_Authenticator credential;
-	struct netr_Authenticator return_authenticator;
-	enum netr_SamDatabaseID database_id = db_type;
-	uint16_t restart_state = 0;
-	uint32_t sync_context = 0;
-	DATA_BLOB session_key;
 
-	if (!(mem_ctx = talloc_init("fetch_database")))
-		return NT_STATUS_NO_MEMORY;
-
-	switch( db_type ) {
-	case SAM_DATABASE_DOMAIN:
-		d_printf("Fetching DOMAIN database\n");
-		break;
-	case SAM_DATABASE_BUILTIN:
-		d_printf("Fetching BUILTIN database\n");
-		break;
-	case SAM_DATABASE_PRIVS:
-		d_printf("Fetching PRIVS databases\n");
-		break;
-	default:
-		d_printf("Fetching unknown database type %u\n", db_type );
-		break;
+	for (i = 0; i < r->num_deltas; i++) {
+		fetch_sam_entry(mem_ctx, database_id, &r->delta_enum[i], ctx);
 	}
 
-	do {
-		struct netr_DELTA_ENUM_ARRAY *delta_enum_array = NULL;
-
-		netlogon_creds_client_step(pipe_hnd->dc, &credential);
-
-		result = rpccli_netr_DatabaseSync2(pipe_hnd, mem_ctx,
-						   logon_server,
-						   computername,
-						   &credential,
-						   &return_authenticator,
-						   database_id,
-						   restart_state,
-						   &sync_context,
-						   &delta_enum_array,
-						   0xffff);
-
-		/* Check returned credentials. */
-		if (!netlogon_creds_client_check(pipe_hnd->dc,
-						 &return_authenticator.cred)) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list