⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libnet_becomedc.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	return NT_STATUS_OK;}static NTSTATUS test_become_dc_schema_chunk(void *private_data,					    const struct libnet_BecomeDC_StoreChunk *c){	struct test_become_dc_state *s = talloc_get_type(private_data, struct test_become_dc_state);	WERROR status;	const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;	uint32_t total_object_count;	uint32_t object_count;	struct drsuapi_DsReplicaObjectListItemEx *first_object;	struct drsuapi_DsReplicaObjectListItemEx *cur;	switch (c->ctr_level) {	case 1:		mapping_ctr		= &c->ctr1->mapping_ctr;		total_object_count	= c->ctr1->total_object_count;		object_count		= c->ctr1->object_count;		first_object		= c->ctr1->first_object;		break;	case 6:		mapping_ctr		= &c->ctr6->mapping_ctr;		total_object_count	= c->ctr6->total_object_count;		object_count		= c->ctr6->object_count;		first_object		= c->ctr6->first_object;		break;	default:		return NT_STATUS_INVALID_PARAMETER;	}	if (total_object_count) {		DEBUG(0,("Schema-DN[%s] objects[%u/%u]\n",			c->partition->nc.dn, object_count, total_object_count));	} else {		DEBUG(0,("Schema-DN[%s] objects[%u]\n",		c->partition->nc.dn, object_count));	}	if (!s->schema) {		s->self_made_schema = dsdb_new_schema(s, lp_iconv_convenience(s->lp_ctx));		NT_STATUS_HAVE_NO_MEMORY(s->self_made_schema);		status = dsdb_load_oid_mappings_drsuapi(s->self_made_schema, mapping_ctr);		if (!W_ERROR_IS_OK(status)) {			return werror_to_ntstatus(status);		}		s->schema = s->self_made_schema;	} else {		status = dsdb_verify_oid_mappings_drsuapi(s->schema, mapping_ctr);		if (!W_ERROR_IS_OK(status)) {			return werror_to_ntstatus(status);		}	}	if (!s->schema_part.first_object) {		s->schema_part.object_count = object_count;		s->schema_part.first_object = talloc_steal(s, first_object);	} else {		s->schema_part.object_count		+= object_count;		s->schema_part.last_object->next_object = talloc_steal(s->schema_part.last_object,								       first_object);	}	for (cur = first_object; cur->next_object; cur = cur->next_object) {}	s->schema_part.last_object = cur;	if (c->partition->highwatermark.tmp_highest_usn == c->partition->highwatermark.highest_usn) {		return test_apply_schema(s, c);	}	return NT_STATUS_OK;}static NTSTATUS test_become_dc_store_chunk(void *private_data,					   const struct libnet_BecomeDC_StoreChunk *c){	struct test_become_dc_state *s = talloc_get_type(private_data, struct test_become_dc_state);	WERROR status;	const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;	uint32_t total_object_count;	uint32_t object_count;	struct drsuapi_DsReplicaObjectListItemEx *first_object;	uint32_t linked_attributes_count;	struct drsuapi_DsReplicaLinkedAttribute *linked_attributes;	const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector;	struct dsdb_extended_replicated_objects *objs;	struct repsFromTo1 *s_dsa;	char *tmp_dns_name;	uint32_t i;	s_dsa			= talloc_zero(s, struct repsFromTo1);	NT_STATUS_HAVE_NO_MEMORY(s_dsa);	s_dsa->other_info	= talloc(s_dsa, struct repsFromTo1OtherInfo);	NT_STATUS_HAVE_NO_MEMORY(s_dsa->other_info);	switch (c->ctr_level) {	case 1:		mapping_ctr			= &c->ctr1->mapping_ctr;		total_object_count		= c->ctr1->total_object_count;		object_count			= c->ctr1->object_count;		first_object			= c->ctr1->first_object;		linked_attributes_count		= 0;		linked_attributes		= NULL;		s_dsa->highwatermark		= c->ctr1->new_highwatermark;		s_dsa->source_dsa_obj_guid	= c->ctr1->source_dsa_guid;		s_dsa->source_dsa_invocation_id = c->ctr1->source_dsa_invocation_id;		uptodateness_vector		= NULL; /* TODO: map it */		break;	case 6:		mapping_ctr			= &c->ctr6->mapping_ctr;		total_object_count		= c->ctr6->total_object_count;		object_count			= c->ctr6->object_count;		first_object			= c->ctr6->first_object;		linked_attributes_count		= c->ctr6->linked_attributes_count;		linked_attributes		= c->ctr6->linked_attributes;		s_dsa->highwatermark		= c->ctr6->new_highwatermark;		s_dsa->source_dsa_obj_guid	= c->ctr6->source_dsa_guid;		s_dsa->source_dsa_invocation_id = c->ctr6->source_dsa_invocation_id;		uptodateness_vector		= c->ctr6->uptodateness_vector;		break;	default:		return NT_STATUS_INVALID_PARAMETER;	}	s_dsa->replica_flags		= DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE					| DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP					| DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS;	memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule));	tmp_dns_name	= GUID_string(s_dsa->other_info, &s_dsa->source_dsa_obj_guid);	NT_STATUS_HAVE_NO_MEMORY(tmp_dns_name);	tmp_dns_name	= talloc_asprintf_append_buffer(tmp_dns_name, "._msdcs.%s", c->forest->dns_name);	NT_STATUS_HAVE_NO_MEMORY(tmp_dns_name);	s_dsa->other_info->dns_name = tmp_dns_name;	if (total_object_count) {		DEBUG(0,("Partition[%s] objects[%u/%u]\n",			c->partition->nc.dn, object_count, total_object_count));	} else {		DEBUG(0,("Partition[%s] objects[%u]\n",		c->partition->nc.dn, object_count));	}	status = dsdb_extended_replicated_objects_commit(s->ldb,							 c->partition->nc.dn,							 mapping_ctr,							 object_count,							 first_object,							 linked_attributes_count,							 linked_attributes,							 s_dsa,							 uptodateness_vector,							 c->gensec_skey,							 s, &objs);	if (!W_ERROR_IS_OK(status)) {		DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));		return werror_to_ntstatus(status);	}	if (lp_parm_bool(s->tctx->lp_ctx, NULL, "become dc", "dump objects", false)) {		for (i=0; i < objs->num_objects; i++) {			struct ldb_ldif ldif;			fprintf(stdout, "#\n");			ldif.changetype = LDB_CHANGETYPE_NONE;			ldif.msg = objs->objects[i].msg;			ldb_ldif_write_file(s->ldb, stdout, &ldif);			NDR_PRINT_DEBUG(replPropertyMetaDataBlob, objs->objects[i].meta_data);		}	}	talloc_free(s_dsa);	talloc_free(objs);	for (i=0; i < linked_attributes_count; i++) {		const struct dsdb_attribute *sa;		if (!linked_attributes[i].identifier) {			return NT_STATUS_FOOBAR;				}		if (!linked_attributes[i].value.blob) {			return NT_STATUS_FOOBAR;				}		sa = dsdb_attribute_by_attributeID_id(s->schema,						      linked_attributes[i].attid);		if (!sa) {			return NT_STATUS_FOOBAR;		}		if (lp_parm_bool(s->tctx->lp_ctx, NULL, "become dc", "dump objects", false)) {			DEBUG(0,("# %s\n", sa->lDAPDisplayName));			NDR_PRINT_DEBUG(drsuapi_DsReplicaLinkedAttribute, &linked_attributes[i]);			dump_data(0,				linked_attributes[i].value.blob->data,				linked_attributes[i].value.blob->length);		}	}	return NT_STATUS_OK;}bool torture_net_become_dc(struct torture_context *torture){	bool ret = true;	NTSTATUS status;	struct libnet_BecomeDC b;	struct libnet_UnbecomeDC u;	struct test_become_dc_state *s;	struct ldb_message *msg;	int ldb_ret;	uint32_t i;	char *sam_ldb_path;	char *location = NULL;	torture_assert_ntstatus_ok(torture, torture_temp_dir(torture, "libnet_BecomeDC", &location), 				   "torture_temp_dir should return NT_STATUS_OK" );	s = talloc_zero(torture, struct test_become_dc_state);	if (!s) return false;	s->tctx = torture;	s->lp_ctx = torture->lp_ctx;	s->netbios_name = lp_parm_string(torture->lp_ctx, NULL, "become dc", "smbtorture dc");	if (!s->netbios_name || !s->netbios_name[0]) {		s->netbios_name = "smbtorturedc";	}	s->targetdir = location;	/* Join domain as a member server. */	s->tj = torture_join_domain(torture, s->netbios_name,				 ACB_WSTRUST,				 &s->machine_account);	if (!s->tj) {		DEBUG(0, ("%s failed to join domain as workstation\n",			  s->netbios_name));		return false;	}	s->ctx = libnet_context_init(torture->ev, torture->lp_ctx);	s->ctx->cred = cmdline_credentials;	s->ldb = ldb_init(s);	ZERO_STRUCT(b);	b.in.domain_dns_name		= torture_join_dom_dns_name(s->tj);	b.in.domain_netbios_name	= torture_join_dom_netbios_name(s->tj);	b.in.domain_sid			= torture_join_sid(s->tj);	b.in.source_dsa_address		= torture_setting_string(torture, "host", NULL);	b.in.dest_dsa_netbios_name	= s->netbios_name;	b.in.callbacks.private_data	= s;	b.in.callbacks.check_options	= test_become_dc_check_options;	b.in.callbacks.prepare_db = test_become_dc_prepare_db;	b.in.callbacks.schema_chunk	= test_become_dc_schema_chunk;	b.in.callbacks.config_chunk	= test_become_dc_store_chunk;	b.in.callbacks.domain_chunk	= test_become_dc_store_chunk;	status = libnet_BecomeDC(s->ctx, s, &b);	if (!NT_STATUS_IS_OK(status)) {		printf("libnet_BecomeDC() failed - %s\n", nt_errstr(status));		ret = false;		goto cleanup;	}	msg = ldb_msg_new(s);	if (!msg) {		printf("ldb_msg_new() failed\n");		ret = false;		goto cleanup;	}	msg->dn = ldb_dn_new(msg, s->ldb, "@ROOTDSE");	if (!msg->dn) {		printf("ldb_msg_new(@ROOTDSE) failed\n");		ret = false;		goto cleanup;	}	ldb_ret = ldb_msg_add_string(msg, "isSynchronized", "TRUE");	if (ldb_ret != LDB_SUCCESS) {		printf("ldb_msg_add_string(msg, isSynchronized, TRUE) failed: %d\n", ldb_ret);		ret = false;		goto cleanup;	}	for (i=0; i < msg->num_elements; i++) {		msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;	}	printf("mark ROOTDSE with isSynchronized=TRUE\n");	ldb_ret = ldb_modify(s->ldb, msg);	if (ldb_ret != LDB_SUCCESS) {		printf("ldb_modify() failed: %d\n", ldb_ret);		ret = false;		goto cleanup;	}		/* reopen the ldb */	talloc_free(s->ldb); /* this also free's the s->schema, because dsdb_set_schema() steals it */	s->schema = NULL;	sam_ldb_path = talloc_asprintf(s, "%s/%s", s->targetdir, "private/sam.ldb");	DEBUG(0,("Reopen the SAM LDB with system credentials and all replicated data: %s\n", sam_ldb_path));	s->ldb = ldb_wrap_connect(s, s->tctx->ev, s->lp_ctx, sam_ldb_path,				  system_session(s, s->lp_ctx),				  NULL, 0, NULL);	if (!s->ldb) {		DEBUG(0,("Failed to open '%s'\n",			sam_ldb_path));		ret = false;		goto cleanup;	}	s->schema = dsdb_get_schema(s->ldb);	if (!s->schema) {		DEBUG(0,("Failed to get loaded dsdb_schema\n"));		ret = false;		goto cleanup;	}	/* Make sure we get this from the command line */	if (lp_parm_bool(torture->lp_ctx, NULL, "become dc", "do not unjoin", false)) {		talloc_free(s);		return ret;	}cleanup:	ZERO_STRUCT(u);	u.in.domain_dns_name		= torture_join_dom_dns_name(s->tj);	u.in.domain_netbios_name	= torture_join_dom_netbios_name(s->tj);	u.in.source_dsa_address		= torture_setting_string(torture, "host", NULL);	u.in.dest_dsa_netbios_name	= s->netbios_name;	status = libnet_UnbecomeDC(s->ctx, s, &u);	if (!NT_STATUS_IS_OK(status)) {		printf("libnet_UnbecomeDC() failed - %s\n", nt_errstr(status));		ret = false;	}	/* Leave domain. */                          	torture_leave_domain(s->tj);	talloc_free(s);	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -