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

📄 handles.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Unix SMB/CIFS implementation.   test suite for behaviour of rpc policy handles   Copyright (C) Andrew Tridgell 2007      This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 3 of the License, or   (at your option) any later version.      This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.      You should have received a copy of the GNU General Public License   along with this program.  If not, see <http://www.gnu.org/licenses/>.*/#include "includes.h"#include "torture/torture.h"#include "librpc/gen_ndr/ndr_samr_c.h"#include "librpc/gen_ndr/ndr_lsa_c.h"#include "librpc/gen_ndr/ndr_drsuapi_c.h"#include "torture/rpc/rpc.h"/*  this tests the use of policy handles between connections*/static bool test_handles_lsa(struct torture_context *torture){	NTSTATUS status;	struct dcerpc_pipe *p1, *p2;	struct policy_handle handle;	struct policy_handle handle2;	struct lsa_ObjectAttribute attr;	struct lsa_QosInfo qos;	struct lsa_OpenPolicy r;	struct lsa_Close c;	uint16_t system_name = '\\';	TALLOC_CTX *mem_ctx = talloc_new(torture);	torture_comment(torture, "RPC-HANDLE-LSARPC\n");	status = torture_rpc_connection(torture, &p1, &ndr_table_lsarpc);	torture_assert_ntstatus_ok(torture, status, "opening lsa pipe1");	status = torture_rpc_connection(torture, &p2, &ndr_table_lsarpc);	torture_assert_ntstatus_ok(torture, status, "opening lsa pipe1");	qos.len = 0;	qos.impersonation_level = 2;	qos.context_mode = 1;	qos.effective_only = 0;	attr.len = 0;	attr.root_dir = NULL;	attr.object_name = NULL;	attr.attributes = 0;	attr.sec_desc = NULL;	attr.sec_qos = &qos;	r.in.system_name = &system_name;	r.in.attr = &attr;	r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	r.out.handle = &handle;	status = dcerpc_lsa_OpenPolicy(p1, mem_ctx, &r);	if (!NT_STATUS_IS_OK(status)) {		torture_comment(torture, "lsa_OpenPolicy not supported - skipping\n");		talloc_free(mem_ctx);		return true;	}	c.in.handle = &handle;	c.out.handle = &handle2;	status = dcerpc_lsa_Close(p2, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p2");	torture_assert_int_equal(torture, p2->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p2");	status = dcerpc_lsa_Close(p1, mem_ctx, &c);	torture_assert_ntstatus_ok(torture, status, "closing policy handle on p1");	status = dcerpc_lsa_Close(p1, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p1 again");	torture_assert_int_equal(torture, p1->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p1 again");		talloc_free(mem_ctx);	return true;}static bool test_handles_lsa_shared(struct torture_context *torture){	NTSTATUS status;	struct dcerpc_pipe *p1, *p2, *p3, *p4, *p5;	struct policy_handle handle;	struct policy_handle handle2;	struct lsa_ObjectAttribute attr;	struct lsa_QosInfo qos;	struct lsa_OpenPolicy r;	struct lsa_Close c;	struct lsa_QuerySecurity qsec;	uint16_t system_name = '\\';	TALLOC_CTX *mem_ctx = talloc_new(torture);	enum dcerpc_transport_t transport;	uint32_t assoc_group_id;	torture_comment(torture, "RPC-HANDLE-LSARPC-SHARED\n");	torture_comment(torture, "connect lsa pipe1\n");	status = torture_rpc_connection(torture, &p1, &ndr_table_lsarpc);	torture_assert_ntstatus_ok(torture, status, "opening lsa pipe1");	transport	= p1->conn->transport.transport,	assoc_group_id	= p1->assoc_group_id;	torture_comment(torture, "use assoc_group_id[0x%08X] for new connections\n", assoc_group_id);	torture_comment(torture, "connect lsa pipe2\n");	status = torture_rpc_connection_transport(torture, &p2, &ndr_table_lsarpc,						  transport,						  assoc_group_id);	torture_assert_ntstatus_ok(torture, status, "opening lsa pipe2");	qos.len = 0;	qos.impersonation_level = 2;	qos.context_mode = 1;	qos.effective_only = 0;	attr.len = 0;	attr.root_dir = NULL;	attr.object_name = NULL;	attr.attributes = 0;	attr.sec_desc = NULL;	attr.sec_qos = &qos;	r.in.system_name = &system_name;	r.in.attr = &attr;	r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	r.out.handle = &handle;	torture_comment(torture, "open lsa policy handle\n");	status = dcerpc_lsa_OpenPolicy(p1, mem_ctx, &r);	if (!NT_STATUS_IS_OK(status)) {		torture_comment(torture, "lsa_OpenPolicy not supported - skipping\n");		talloc_free(mem_ctx);		return true;	}	/*	 * connect p3 after the policy handle is opened	 */	torture_comment(torture, "connect lsa pipe3 after the policy handle is opened\n");	status = torture_rpc_connection_transport(torture, &p3, &ndr_table_lsarpc,						  transport,						  assoc_group_id);	torture_assert_ntstatus_ok(torture, status, "opening lsa pipe3");	qsec.in.handle 		= &handle;	qsec.in.sec_info	= 0;	c.in.handle = &handle;	c.out.handle = &handle2;	/*	 * use policy handle on all 3 connections	 */	torture_comment(torture, "use the policy handle on p1,p2,p3\n");	status = dcerpc_lsa_QuerySecurity(p1, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "use policy handle on p1");	status = dcerpc_lsa_QuerySecurity(p2, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "use policy handle on p2");	status = dcerpc_lsa_QuerySecurity(p3, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "use policy handle on p3");	/*	 * close policy handle on connection 2 and the others get a fault	 */	torture_comment(torture, "close the policy handle on p2 others get a fault\n");	status = dcerpc_lsa_Close(p2, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "closing policy handle on p2");	status = dcerpc_lsa_Close(p1, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p1 again");	torture_assert_int_equal(torture, p1->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p1 again");	status = dcerpc_lsa_Close(p3, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p3");	torture_assert_int_equal(torture, p1->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p3");	status = dcerpc_lsa_Close(p2, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p2 again");	torture_assert_int_equal(torture, p1->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p2 again");	/*	 * open a new policy handle on p3	 */	torture_comment(torture, "open a new policy handle on p3\n");	status = dcerpc_lsa_OpenPolicy(p3, mem_ctx, &r);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "open policy handle on p3");	/*	 * use policy handle on all 3 connections	 */	torture_comment(torture, "use the policy handle on p1,p2,p3\n");	status = dcerpc_lsa_QuerySecurity(p1, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "use policy handle on p1");	status = dcerpc_lsa_QuerySecurity(p2, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "use policy handle on p2");	status = dcerpc_lsa_QuerySecurity(p3, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "use policy handle on p3");	/*	 * close policy handle on connection 2 and the others get a fault	 */	torture_comment(torture, "close the policy handle on p2 others get a fault\n");	status = dcerpc_lsa_Close(p2, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "closing policy handle on p2");	status = dcerpc_lsa_Close(p1, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p1 again");	torture_assert_int_equal(torture, p1->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p1 again");	status = dcerpc_lsa_Close(p3, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p3");	torture_assert_int_equal(torture, p1->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p3");	status = dcerpc_lsa_Close(p2, mem_ctx, &c);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_NET_WRITE_FAULT, 				      "closing policy handle on p2 again");	torture_assert_int_equal(torture, p1->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, 				      "closing policy handle on p2 again");	/*	 * open a new policy handle	 */	torture_comment(torture, "open a new policy handle on p1 and use it\n");	status = dcerpc_lsa_OpenPolicy(p1, mem_ctx, &r);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "open 2nd policy handle on p1");	status = dcerpc_lsa_QuerySecurity(p1, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "QuerySecurity handle on p1");	/* close first connection */	torture_comment(torture, "disconnect p1\n");	talloc_free(p1);	msleep(5);	/*	 * and it's still available on p2,p3	 */	torture_comment(torture, "use policy handle on p2,p3\n");	status = dcerpc_lsa_QuerySecurity(p2, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 				      "QuerySecurity handle on p2 after p1 was disconnected");	status = dcerpc_lsa_QuerySecurity(p3, mem_ctx, &qsec);	torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, 

⌨️ 快捷键说明

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