• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/source4/torture/rpc/
1/*
2   Unix SMB/CIFS implementation.
3   test suite for oxidresolve operations
4
5   Copyright (C) Jelmer Vernooij 2004
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19*/
20
21#include "includes.h"
22#include "torture/torture.h"
23#include "librpc/gen_ndr/ndr_oxidresolver_c.h"
24#include "librpc/gen_ndr/ndr_remact_c.h"
25#include "librpc/gen_ndr/epmapper.h"
26#include "torture/rpc/rpc.h"
27
28#define CLSID_IMAGEDOC "02B01C80-E03D-101A-B294-00DD010F2BF9"
29
30const struct GUID IUnknown_uuid = {
31	0x00000000,0x0000,0x0000,{0xc0,0x00},{0x00,0x00,0x00,0x00,0x00,0x46}
32};
33
34static bool test_RemoteActivation(struct torture_context *tctx,
35				 uint64_t *oxid, struct GUID *oid)
36{
37	struct RemoteActivation r;
38	NTSTATUS status;
39	struct GUID iids[2];
40	uint16_t protseq[3] = { EPM_PROTOCOL_TCP, EPM_PROTOCOL_NCALRPC, EPM_PROTOCOL_UUID };
41	struct dcerpc_pipe *p;
42
43	status = torture_rpc_connection(tctx, &p,
44					&ndr_table_IRemoteActivation);
45
46	if (!NT_STATUS_IS_OK(status)) {
47		return false;
48	}
49
50	ZERO_STRUCT(r.in);
51	r.in.this_object.version.MajorVersion = 5;
52	r.in.this_object.version.MinorVersion = 1;
53	r.in.this_object.cid = GUID_random();
54	GUID_from_string(CLSID_IMAGEDOC, &r.in.Clsid);
55	r.in.ClientImpLevel = RPC_C_IMP_LEVEL_IDENTIFY;
56	r.in.num_protseqs = 3;
57	r.in.protseq = protseq;
58	r.in.Interfaces = 1;
59	iids[0] = IUnknown_uuid;
60	r.in.pIIDs = iids;
61	r.out.pOxid = oxid;
62	r.out.ipidRemUnknown = oid;
63
64	status = dcerpc_RemoteActivation(p, tctx, &r);
65	if(NT_STATUS_IS_ERR(status)) {
66		fprintf(stderr, "RemoteActivation: %s\n", nt_errstr(status));
67		return false;
68	}
69
70	if(!W_ERROR_IS_OK(r.out.result)) {
71		fprintf(stderr, "RemoteActivation: %s\n", win_errstr(r.out.result));
72		return false;
73	}
74
75	if(!W_ERROR_IS_OK(*r.out.hr)) {
76		fprintf(stderr, "RemoteActivation: %s\n", win_errstr(*r.out.hr));
77		return false;
78	}
79
80	if(!W_ERROR_IS_OK(r.out.results[0])) {
81		fprintf(stderr, "RemoteActivation: %s\n", win_errstr(r.out.results[0]));
82		return false;
83	}
84
85	return true;
86}
87
88static bool test_SimplePing(struct torture_context *tctx,
89			   struct dcerpc_pipe *p)
90{
91	struct SimplePing r;
92	NTSTATUS status;
93	uint64_t setid;
94
95	r.in.SetId = &setid;
96
97	status = dcerpc_SimplePing(p, tctx, &r);
98	torture_assert_ntstatus_ok(tctx, status, "SimplePing");
99	torture_assert_werr_ok(tctx, r.out.result, "SimplePing");
100
101	return true;
102}
103
104static bool test_ComplexPing(struct torture_context *tctx,
105			     struct dcerpc_pipe *p)
106{
107	struct ComplexPing r;
108	NTSTATUS status;
109	uint64_t setid;
110	struct GUID oid;
111	uint64_t oxid;
112
113	if (!test_RemoteActivation(tctx, &oxid, &oid))
114		return false;
115
116	setid = 0;
117	ZERO_STRUCT(r.in);
118
119	r.in.SequenceNum = 0;
120	r.in.SetId = &setid;
121	r.in.cAddToSet = 1;
122	r.in.AddToSet = &oid;
123
124	status = dcerpc_ComplexPing(p, tctx, &r);
125	if(NT_STATUS_IS_ERR(status)) {
126		fprintf(stderr, "ComplexPing: %s\n", nt_errstr(status));
127		return 0;
128	}
129
130	if(!W_ERROR_IS_OK(r.out.result)) {
131		fprintf(stderr, "ComplexPing: %s\n", win_errstr(r.out.result));
132		return 0;
133	}
134
135
136
137	return 1;
138}
139
140static bool test_ServerAlive(struct torture_context *tctx,
141			    struct dcerpc_pipe *p)
142{
143	struct ServerAlive r;
144	NTSTATUS status;
145
146	status = dcerpc_ServerAlive(p, tctx, &r);
147	torture_assert_ntstatus_ok(tctx, status, "ServerAlive");
148	torture_assert_werr_ok(tctx, r.out.result, "ServerAlive");
149
150	return true;
151}
152
153static bool test_ResolveOxid(struct torture_context *tctx,
154			     struct dcerpc_pipe *p)
155{
156	struct ResolveOxid r;
157	NTSTATUS status;
158	uint16_t protseq[2] = { EPM_PROTOCOL_TCP, EPM_PROTOCOL_SMB };
159	uint64_t oxid;
160	struct GUID oid;
161
162	if (!test_RemoteActivation(tctx, &oxid, &oid))
163		return false;
164
165	r.in.pOxid = oxid;
166	r.in.cRequestedProtseqs = 2;
167	r.in.arRequestedProtseqs = protseq;
168
169	status = dcerpc_ResolveOxid(p, tctx, &r);
170	torture_assert_ntstatus_ok(tctx, status, "ResolveOxid");
171	torture_assert_werr_ok(tctx, r.out.result, "ResolveOxid");
172
173	return true;
174}
175
176static bool test_ResolveOxid2(struct torture_context *tctx,
177			      struct dcerpc_pipe *p)
178{
179	struct ResolveOxid2 r;
180	NTSTATUS status;
181	uint16_t protseq[2] = { EPM_PROTOCOL_TCP, EPM_PROTOCOL_SMB };
182	uint64_t oxid;
183	struct GUID oid;
184
185	if (!test_RemoteActivation(tctx, &oxid, &oid))
186		return false;
187
188	r.in.pOxid = oxid;
189	r.in.cRequestedProtseqs = 2;
190	r.in.arRequestedProtseqs = protseq;
191
192	status = dcerpc_ResolveOxid2(p, tctx, &r);
193	torture_assert_ntstatus_ok(tctx, status, "ResolveOxid2");
194
195	torture_assert_werr_ok(tctx, r.out.result, "ResolveOxid2");
196
197	torture_comment(tctx, "Remote server versions: %d, %d\n", r.out.ComVersion->MajorVersion, r.out.ComVersion->MinorVersion);
198
199	return true;
200}
201
202static bool test_ServerAlive2(struct torture_context *tctx,
203			     struct dcerpc_pipe *p)
204{
205	struct ServerAlive2 r;
206	NTSTATUS status;
207
208	status = dcerpc_ServerAlive2(p, tctx, &r);
209	torture_assert_ntstatus_ok(tctx, status, "ServerAlive2");
210	torture_assert_werr_ok(tctx, r.out.result, "ServerAlive2");
211
212	return true;
213}
214
215struct torture_suite *torture_rpc_oxidresolve(TALLOC_CTX *mem_ctx)
216{
217	struct torture_suite *suite = torture_suite_create(mem_ctx,
218							   "OXIDRESOLVE");
219	struct torture_rpc_tcase *tcase;
220
221	tcase = torture_suite_add_rpc_iface_tcase(suite, "oxidresolver",
222					  &ndr_table_IOXIDResolver);
223
224	torture_rpc_tcase_add_test(tcase, "ServerAlive", test_ServerAlive);
225
226	torture_rpc_tcase_add_test(tcase, "ServerAlive2", test_ServerAlive2);
227
228	torture_rpc_tcase_add_test(tcase, "ComplexPing", test_ComplexPing);
229
230	torture_rpc_tcase_add_test(tcase, "SimplePing", test_SimplePing);
231
232	torture_rpc_tcase_add_test(tcase, "ResolveOxid", test_ResolveOxid);
233
234	torture_rpc_tcase_add_test(tcase, "ResolveOxid2", test_ResolveOxid2);
235
236	return suite;
237}
238