2 Unix SMB/CIFS implementation.
6 Copyright (C) Andrew Tridgell 2003
7 Copyright (C) Stefan (metze) Metzmacher 2004
8 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2005
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "librpc/gen_ndr/ndr_drsuapi_c.h"
26 #include "torture/rpc/torture_rpc.h"
28 #include "libcli/security/security.h"
32 struct DsCrackNamesPrivate
{
33 struct DsPrivate base
;
35 /* following names are used in Crack Names Matrix test */
36 const char *fqdn_name
;
37 const char *user_principal_name
;
38 const char *service_principal_name
;
41 static bool test_DsCrackNamesMatrix(struct torture_context
*tctx
,
42 struct DsPrivate
*priv
, const char *dn
,
43 const char *user_principal_name
, const char *service_principal_name
)
47 struct drsuapi_DsCrackNames r
;
48 union drsuapi_DsNameRequest req
;
50 union drsuapi_DsNameCtr ctr
;
51 struct dcerpc_pipe
*p
= priv
->drs_pipe
;
52 TALLOC_CTX
*mem_ctx
= priv
;
54 enum drsuapi_DsNameFormat formats
[] = {
55 DRSUAPI_DS_NAME_FORMAT_UNKNOWN
,
56 DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
57 DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
58 DRSUAPI_DS_NAME_FORMAT_DISPLAY
,
59 DRSUAPI_DS_NAME_FORMAT_GUID
,
60 DRSUAPI_DS_NAME_FORMAT_CANONICAL
,
61 DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
62 DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX
,
63 DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
64 DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
65 DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN
67 struct drsuapi_DsNameString names
[ARRAY_SIZE(formats
)];
70 const char *n_matrix
[ARRAY_SIZE(formats
)][ARRAY_SIZE(formats
)];
71 const char *n_from
[ARRAY_SIZE(formats
)];
74 r
.in
.bind_handle
= &priv
->bind_handle
;
77 r
.in
.req
->req1
.codepage
= 1252; /* german */
78 r
.in
.req
->req1
.language
= 0x00000407; /* german */
79 r
.in
.req
->req1
.count
= 1;
80 r
.in
.req
->req1
.names
= names
;
81 r
.in
.req
->req1
.format_flags
= DRSUAPI_DS_NAME_FLAG_NO_FLAGS
;
83 r
.out
.level_out
= &level_out
;
88 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
89 r
.in
.req
->req1
.format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
;
90 r
.in
.req
->req1
.format_desired
= formats
[i
];
92 torture_comment(tctx
, "Testing DsCrackNames (matrix prep) with name '%s'"
93 " offered format: %d desired format:%d\n",
95 r
.in
.req
->req1
.format_offered
,
96 r
.in
.req
->req1
.format_desired
);
97 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
98 if (!NT_STATUS_IS_OK(status
)) {
99 const char *errstr
= nt_errstr(status
);
100 err_msg
= talloc_asprintf(mem_ctx
,
101 "testing DsCrackNames (matrix prep) with name '%s' from format: %d desired format:%d failed - %s",
102 names
[0].str
, r
.in
.req
->req1
.format_offered
, r
.in
.req
->req1
.format_desired
, errstr
);
103 torture_fail(tctx
, err_msg
);
104 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
105 err_msg
= talloc_asprintf(mem_ctx
,
106 "testing DsCrackNames (matrix prep) with name '%s' from format: %d desired format:%d failed - %s",
107 names
[0].str
, r
.in
.req
->req1
.format_offered
, r
.in
.req
->req1
.format_desired
, win_errstr(r
.out
.result
));
108 torture_fail(tctx
, err_msg
);
111 switch (formats
[i
]) {
112 case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
:
113 if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
) {
114 err_msg
= talloc_asprintf(mem_ctx
,
115 "Unexpected error (%d): This name lookup should fail",
116 r
.out
.ctr
->ctr1
->array
[0].status
);
117 torture_fail(tctx
, err_msg
);
119 torture_comment(tctx
, __location__
": (expected) error\n");
121 case DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
:
122 if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_NO_MAPPING
) {
123 err_msg
= talloc_asprintf(mem_ctx
,
124 "Unexpected error (%d): This name lookup should fail",
125 r
.out
.ctr
->ctr1
->array
[0].status
);
126 torture_fail(tctx
, err_msg
);
128 torture_comment(tctx
, __location__
": (expected) error\n");
130 case DRSUAPI_DS_NAME_FORMAT_UNKNOWN
: /* should fail as we ask server to convert to Unknown format */
131 case DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN
:
132 if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR
) {
133 err_msg
= talloc_asprintf(mem_ctx
,
134 "Unexpected error (%d): This name lookup should fail",
135 r
.out
.ctr
->ctr1
->array
[0].status
);
136 torture_fail(tctx
, err_msg
);
138 torture_comment(tctx
, __location__
": (expected) error\n");
141 if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_OK
) {
142 err_msg
= talloc_asprintf(mem_ctx
,
143 "DsCrackNames error: %d",
144 r
.out
.ctr
->ctr1
->array
[0].status
);
145 torture_fail(tctx
, err_msg
);
150 switch (formats
[i
]) {
151 case DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
:
152 n_from
[i
] = user_principal_name
;
154 case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
:
155 n_from
[i
] = service_principal_name
;
157 case DRSUAPI_DS_NAME_FORMAT_UNKNOWN
:
158 case DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN
:
162 n_from
[i
] = r
.out
.ctr
->ctr1
->array
[0].result_name
;
163 printf("%s\n", n_from
[i
]);
168 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
169 for (j
= 0; j
< ARRAY_SIZE(formats
); j
++) {
170 r
.in
.req
->req1
.format_offered
= formats
[i
];
171 r
.in
.req
->req1
.format_desired
= formats
[j
];
173 n_matrix
[i
][j
] = NULL
;
176 names
[0].str
= n_from
[i
];
177 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
178 if (!NT_STATUS_IS_OK(status
)) {
179 const char *errstr
= nt_errstr(status
);
180 err_msg
= talloc_asprintf(mem_ctx
,
181 "testing DsCrackNames (matrix) with name '%s' from format: %d desired format:%d failed - %s",
182 names
[0].str
, r
.in
.req
->req1
.format_offered
, r
.in
.req
->req1
.format_desired
, errstr
);
183 torture_fail(tctx
, err_msg
);
184 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
185 err_msg
= talloc_asprintf(mem_ctx
,
186 "testing DsCrackNames (matrix) with name '%s' from format: %d desired format:%d failed - %s",
187 names
[0].str
, r
.in
.req
->req1
.format_offered
, r
.in
.req
->req1
.format_desired
,
188 win_errstr(r
.out
.result
));
189 torture_fail(tctx
, err_msg
);
192 if (r
.out
.ctr
->ctr1
->array
[0].status
== DRSUAPI_DS_NAME_STATUS_OK
) {
193 n_matrix
[i
][j
] = r
.out
.ctr
->ctr1
->array
[0].result_name
;
195 n_matrix
[i
][j
] = NULL
;
200 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
201 for (j
= 0; j
< ARRAY_SIZE(formats
); j
++) {
202 torture_comment(tctx
, "Converting %s (format %d)"
204 n_from
[i
] == NULL
? "NULL" : n_from
[i
],
205 formats
[i
], formats
[j
],
206 n_matrix
[i
][j
] == NULL
?
207 "NULL" : n_matrix
[i
][j
]);
209 if (n_matrix
[i
][j
] == n_from
[j
]) {
211 /* We don't have a from name for these yet (and we can't map to them to find it out) */
212 } else if (n_matrix
[i
][j
] == NULL
&& n_from
[i
] == NULL
) {
214 /* we can't map to these two */
215 } else if (n_matrix
[i
][j
] == NULL
&& formats
[j
] == DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
) {
216 } else if (n_matrix
[i
][j
] == NULL
&& formats
[j
] == DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
) {
217 } else if (n_matrix
[i
][j
] == NULL
&& n_from
[j
] != NULL
) {
218 err_msg
= talloc_asprintf(mem_ctx
,
219 "dcerpc_drsuapi_DsCrackNames mismatch - from %d to %d: should be %s",
220 formats
[i
], formats
[j
], n_from
[j
]);
221 torture_fail(tctx
, err_msg
);
222 } else if (n_matrix
[i
][j
] != NULL
&& n_from
[j
] == NULL
) {
223 err_msg
= talloc_asprintf(mem_ctx
,
224 "dcerpc_drsuapi_DsCrackNames mismatch - from %d to %d: should be %s",
225 formats
[i
], formats
[j
], n_matrix
[i
][j
]);
226 torture_fail(tctx
, err_msg
);
227 } else if (strcmp(n_matrix
[i
][j
], n_from
[j
]) != 0) {
228 err_msg
= talloc_asprintf(mem_ctx
,
229 "dcerpc_drsuapi_DsCrackNames mismatch - from %d to %d: %s should be %s",
230 formats
[i
], formats
[j
], n_matrix
[i
][j
], n_from
[j
]);
231 torture_fail(tctx
, err_msg
);
239 bool test_DsCrackNames(struct torture_context
*tctx
,
240 struct DsPrivate
*priv
)
244 struct drsuapi_DsCrackNames r
;
245 union drsuapi_DsNameRequest req
;
247 union drsuapi_DsNameCtr ctr
;
248 struct drsuapi_DsNameString names
[1];
249 const char *dns_domain
;
250 const char *nt4_domain
;
251 const char *FQDN_1779_name
;
252 struct ldb_context
*ldb
;
253 struct ldb_dn
*FQDN_1779_dn
;
254 struct ldb_dn
*realm_dn
;
255 const char *realm_dn_str
;
256 const char *realm_canonical
;
257 const char *realm_canonical_ex
;
258 const char *user_principal_name
;
259 char *user_principal_name_short
;
260 const char *service_principal_name
;
261 const char *canonical_name
;
262 const char *canonical_ex_name
;
264 const char *test_dc
= torture_join_netbios_name(priv
->join
);
265 struct dcerpc_pipe
*p
= priv
->drs_pipe
;
266 TALLOC_CTX
*mem_ctx
= priv
;
269 r
.in
.bind_handle
= &priv
->bind_handle
;
272 r
.in
.req
->req1
.codepage
= 1252; /* german */
273 r
.in
.req
->req1
.language
= 0x00000407; /* german */
274 r
.in
.req
->req1
.count
= 1;
275 r
.in
.req
->req1
.names
= names
;
276 r
.in
.req
->req1
.format_flags
= DRSUAPI_DS_NAME_FLAG_NO_FLAGS
;
278 r
.in
.req
->req1
.format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
;
279 r
.in
.req
->req1
.format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
;
281 r
.out
.level_out
= &level_out
;
284 dom_sid
= dom_sid_string(mem_ctx
, torture_join_sid(priv
->join
));
286 names
[0].str
= dom_sid
;
288 torture_comment(tctx
, "Testing DsCrackNames with name '%s'"
289 " offered format: %d desired format:%d\n",
291 r
.in
.req
->req1
.format_offered
,
292 r
.in
.req
->req1
.format_desired
);
294 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
295 if (!NT_STATUS_IS_OK(status
)) {
296 const char *errstr
= nt_errstr(status
);
297 err_msg
= talloc_asprintf(mem_ctx
, "dcerpc_drsuapi_DsCrackNames failed - %s", errstr
);
298 torture_fail(tctx
, err_msg
);
299 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
300 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed - %s", win_errstr(r
.out
.result
));
301 torture_fail(tctx
, err_msg
);
302 } else if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_OK
) {
303 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed on name - %d",
304 r
.out
.ctr
->ctr1
->array
[0].status
);
305 torture_fail(tctx
, err_msg
);
308 dns_domain
= r
.out
.ctr
->ctr1
->array
[0].dns_domain_name
;
309 nt4_domain
= r
.out
.ctr
->ctr1
->array
[0].result_name
;
311 r
.in
.req
->req1
.format_desired
= DRSUAPI_DS_NAME_FORMAT_GUID
;
313 torture_comment(tctx
, "Testing DsCrackNames with name '%s'"
314 " offered format: %d desired format:%d\n",
316 r
.in
.req
->req1
.format_offered
,
317 r
.in
.req
->req1
.format_desired
);
319 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
320 if (!NT_STATUS_IS_OK(status
)) {
321 const char *errstr
= nt_errstr(status
);
322 err_msg
= talloc_asprintf(mem_ctx
, "dcerpc_drsuapi_DsCrackNames failed - %s", errstr
);
323 torture_fail(tctx
, err_msg
);
324 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
325 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed - %s", win_errstr(r
.out
.result
));
326 torture_fail(tctx
, err_msg
);
327 } else if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_OK
) {
328 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed on name - %d",
329 r
.out
.ctr
->ctr1
->array
[0].status
);
330 torture_fail(tctx
, err_msg
);
333 priv
->domain_dns_name
= r
.out
.ctr
->ctr1
->array
[0].dns_domain_name
;
334 priv
->domain_guid_str
= r
.out
.ctr
->ctr1
->array
[0].result_name
;
335 GUID_from_string(priv
->domain_guid_str
, &priv
->domain_guid
);
337 r
.in
.req
->req1
.format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
;
339 torture_comment(tctx
, "Testing DsCrackNames with name '%s'"
340 " offered format: %d desired format:%d\n",
342 r
.in
.req
->req1
.format_offered
,
343 r
.in
.req
->req1
.format_desired
);
345 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
346 if (!NT_STATUS_IS_OK(status
)) {
347 const char *errstr
= nt_errstr(status
);
348 err_msg
= talloc_asprintf(mem_ctx
, "dcerpc_drsuapi_DsCrackNames failed - %s", errstr
);
349 torture_fail(tctx
, err_msg
);
350 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
351 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed - %s", win_errstr(r
.out
.result
));
352 torture_fail(tctx
, err_msg
);
353 } else if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_OK
) {
354 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed on name - %d",
355 r
.out
.ctr
->ctr1
->array
[0].status
);
356 torture_fail(tctx
, err_msg
);
359 ldb
= ldb_init(mem_ctx
, tctx
->ev
);
361 realm_dn_str
= r
.out
.ctr
->ctr1
->array
[0].result_name
;
362 realm_dn
= ldb_dn_new(mem_ctx
, ldb
, realm_dn_str
);
363 realm_canonical
= ldb_dn_canonical_string(mem_ctx
, realm_dn
);
365 if (strcmp(realm_canonical
,
366 talloc_asprintf(mem_ctx
, "%s/", dns_domain
))!= 0) {
367 err_msg
= talloc_asprintf(mem_ctx
, "local Round trip on canonical name failed: %s != %s!",
369 talloc_asprintf(mem_ctx
, "%s/", dns_domain
));
370 torture_fail(tctx
, err_msg
);
373 realm_canonical_ex
= ldb_dn_canonical_ex_string(mem_ctx
, realm_dn
);
375 if (strcmp(realm_canonical_ex
,
376 talloc_asprintf(mem_ctx
, "%s\n", dns_domain
))!= 0) {
377 err_msg
= talloc_asprintf(mem_ctx
, "local Round trip on canonical ex name failed: %s != %s!",
379 talloc_asprintf(mem_ctx
, "%s\n", dns_domain
));
380 torture_fail(tctx
, err_msg
);
383 r
.in
.req
->req1
.format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
;
384 r
.in
.req
->req1
.format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
;
385 names
[0].str
= nt4_domain
;
387 torture_comment(tctx
, "Testing DsCrackNames with name '%s'"
388 " offered format: %d desired format:%d\n",
390 r
.in
.req
->req1
.format_offered
,
391 r
.in
.req
->req1
.format_desired
);
393 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
394 if (!NT_STATUS_IS_OK(status
)) {
395 const char *errstr
= nt_errstr(status
);
396 err_msg
= talloc_asprintf(mem_ctx
, "dcerpc_drsuapi_DsCrackNames failed - %s", errstr
);
397 torture_fail(tctx
, err_msg
);
398 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
399 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed - %s", win_errstr(r
.out
.result
));
400 torture_fail(tctx
, err_msg
);
401 } else if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_OK
) {
402 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed on name - %d",
403 r
.out
.ctr
->ctr1
->array
[0].status
);
404 torture_fail(tctx
, err_msg
);
407 priv
->domain_obj_dn
= r
.out
.ctr
->ctr1
->array
[0].result_name
;
409 r
.in
.req
->req1
.format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
;
410 r
.in
.req
->req1
.format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
;
411 names
[0].str
= talloc_asprintf(mem_ctx
, "%s%s$", nt4_domain
, test_dc
);
413 torture_comment(tctx
, "Testing DsCrackNames with name '%s'"
414 " offered format: %d desired format:%d\n",
416 r
.in
.req
->req1
.format_offered
,
417 r
.in
.req
->req1
.format_desired
);
419 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
420 if (!NT_STATUS_IS_OK(status
)) {
421 const char *errstr
= nt_errstr(status
);
422 err_msg
= talloc_asprintf(mem_ctx
, "dcerpc_drsuapi_DsCrackNames failed - %s", errstr
);
423 torture_fail(tctx
, err_msg
);
424 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
425 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed - %s", win_errstr(r
.out
.result
));
426 torture_fail(tctx
, err_msg
);
427 } else if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_OK
) {
428 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed on name - %d",
429 r
.out
.ctr
->ctr1
->array
[0].status
);
430 torture_fail(tctx
, err_msg
);
433 FQDN_1779_name
= r
.out
.ctr
->ctr1
->array
[0].result_name
;
435 r
.in
.req
->req1
.format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
;
436 r
.in
.req
->req1
.format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
;
437 names
[0].str
= priv
->domain_guid_str
;
439 torture_comment(tctx
, "Testing DsCrackNames with name '%s'"
440 " offered format: %d desired format:%d\n",
442 r
.in
.req
->req1
.format_offered
,
443 r
.in
.req
->req1
.format_desired
);
445 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
446 if (!NT_STATUS_IS_OK(status
)) {
447 const char *errstr
= nt_errstr(status
);
448 err_msg
= talloc_asprintf(mem_ctx
, "dcerpc_drsuapi_DsCrackNames failed - %s", errstr
);
449 torture_fail(tctx
, err_msg
);
450 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
451 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed - %s", win_errstr(r
.out
.result
));
452 torture_fail(tctx
, err_msg
);
453 } else if (r
.out
.ctr
->ctr1
->array
[0].status
!= DRSUAPI_DS_NAME_STATUS_OK
) {
454 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed on name - %d",
455 r
.out
.ctr
->ctr1
->array
[0].status
);
456 torture_fail(tctx
, err_msg
);
459 if (strcmp(priv
->domain_dns_name
, r
.out
.ctr
->ctr1
->array
[0].dns_domain_name
) != 0) {
460 err_msg
= talloc_asprintf(mem_ctx
,
461 "DsCrackNames failed to return same DNS name - expected %s got %s",
462 priv
->domain_dns_name
, r
.out
.ctr
->ctr1
->array
[0].dns_domain_name
);
463 torture_fail(tctx
, err_msg
);
466 FQDN_1779_dn
= ldb_dn_new(mem_ctx
, ldb
, FQDN_1779_name
);
468 canonical_name
= ldb_dn_canonical_string(mem_ctx
, FQDN_1779_dn
);
469 canonical_ex_name
= ldb_dn_canonical_ex_string(mem_ctx
, FQDN_1779_dn
);
471 user_principal_name
= talloc_asprintf(mem_ctx
, "%s$@%s", test_dc
, dns_domain
);
473 /* form up a user@DOMAIN */
474 user_principal_name_short
= talloc_asprintf(mem_ctx
, "%s$@%s", test_dc
, nt4_domain
);
475 /* variable nt4_domain includes a trailing \ */
476 user_principal_name_short
[strlen(user_principal_name_short
) - 1] = '\0';
478 service_principal_name
= talloc_asprintf(mem_ctx
, "HOST/%s", test_dc
);
482 enum drsuapi_DsNameFormat format_offered
;
483 enum drsuapi_DsNameFormat format_desired
;
486 const char *expected_str
;
487 const char *expected_dns
;
488 enum drsuapi_DsNameStatus status
;
489 enum drsuapi_DsNameStatus alternate_status
;
490 enum drsuapi_DsNameFlags flags
;
494 .format_offered
= DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
495 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
496 .str
= user_principal_name
,
497 .expected_str
= FQDN_1779_name
,
498 .status
= DRSUAPI_DS_NAME_STATUS_OK
501 .format_offered
= DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
502 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
503 .str
= user_principal_name_short
,
504 .expected_str
= FQDN_1779_name
,
505 .status
= DRSUAPI_DS_NAME_STATUS_OK
508 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
509 .format_desired
= DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
510 .str
= FQDN_1779_name
,
511 .status
= DRSUAPI_DS_NAME_STATUS_NO_MAPPING
514 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
515 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
516 .str
= service_principal_name
,
517 .expected_str
= FQDN_1779_name
,
518 .status
= DRSUAPI_DS_NAME_STATUS_OK
521 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
522 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
523 .str
= talloc_asprintf(mem_ctx
, "cifs/%s.%s", test_dc
, dns_domain
),
524 .comment
= "ServicePrincipal Name",
525 .expected_str
= FQDN_1779_name
,
526 .status
= DRSUAPI_DS_NAME_STATUS_OK
529 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
530 .format_desired
= DRSUAPI_DS_NAME_FORMAT_CANONICAL
,
531 .str
= FQDN_1779_name
,
532 .expected_str
= canonical_name
,
533 .status
= DRSUAPI_DS_NAME_STATUS_OK
536 .format_offered
= DRSUAPI_DS_NAME_FORMAT_CANONICAL
,
537 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
538 .str
= canonical_name
,
539 .expected_str
= FQDN_1779_name
,
540 .status
= DRSUAPI_DS_NAME_STATUS_OK
543 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
544 .format_desired
= DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX
,
545 .str
= FQDN_1779_name
,
546 .expected_str
= canonical_ex_name
,
547 .status
= DRSUAPI_DS_NAME_STATUS_OK
550 .format_offered
= DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX
,
551 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
552 .str
= canonical_ex_name
,
553 .expected_str
= FQDN_1779_name
,
554 .status
= DRSUAPI_DS_NAME_STATUS_OK
557 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
558 .format_desired
= DRSUAPI_DS_NAME_FORMAT_CANONICAL
,
559 .str
= FQDN_1779_name
,
560 .comment
= "DN to cannoical syntactial only",
561 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
562 .expected_str
= canonical_name
,
563 .flags
= DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY
566 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
567 .format_desired
= DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX
,
568 .str
= FQDN_1779_name
,
569 .comment
= "DN to cannoical EX syntactial only",
570 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
571 .expected_str
= canonical_ex_name
,
572 .flags
= DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY
575 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
576 .format_desired
= DRSUAPI_DS_NAME_FORMAT_DISPLAY
,
577 .str
= FQDN_1779_name
,
578 .status
= DRSUAPI_DS_NAME_STATUS_OK
581 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
582 .format_desired
= DRSUAPI_DS_NAME_FORMAT_GUID
,
583 .str
= FQDN_1779_name
,
584 .status
= DRSUAPI_DS_NAME_STATUS_OK
587 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
588 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
589 .str
= priv
->domain_guid_str
,
590 .comment
= "Domain GUID to NT4 ACCOUNT",
591 .expected_str
= nt4_domain
,
592 .status
= DRSUAPI_DS_NAME_STATUS_OK
595 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
596 .format_desired
= DRSUAPI_DS_NAME_FORMAT_CANONICAL
,
597 .str
= priv
->domain_guid_str
,
598 .comment
= "Domain GUID to Canonical",
599 .expected_str
= talloc_asprintf(mem_ctx
, "%s/", dns_domain
),
600 .status
= DRSUAPI_DS_NAME_STATUS_OK
603 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
604 .format_desired
= DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX
,
605 .str
= priv
->domain_guid_str
,
606 .comment
= "Domain GUID to Canonical EX",
607 .expected_str
= talloc_asprintf(mem_ctx
, "%s\n", dns_domain
),
608 .status
= DRSUAPI_DS_NAME_STATUS_OK
611 .format_offered
= DRSUAPI_DS_NAME_FORMAT_DISPLAY
,
612 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
613 .str
= "CN=Microsoft Corporation,L=Redmond,S=Washington,C=US",
614 .comment
= "display name for Microsoft Support Account",
615 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
616 .alternate_status
= DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
,
617 .skip
= torture_setting_bool(tctx
, "samba4", false)
620 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
621 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
622 .str
= GUID_string2(mem_ctx
, torture_join_user_guid(priv
->join
)),
623 .comment
= "Account GUID -> DN",
624 .expected_str
= FQDN_1779_name
,
625 .status
= DRSUAPI_DS_NAME_STATUS_OK
628 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
629 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
630 .str
= GUID_string2(mem_ctx
, torture_join_user_guid(priv
->join
)),
631 .comment
= "Account GUID -> NT4 Account",
632 .expected_str
= talloc_asprintf(mem_ctx
, "%s%s$", nt4_domain
, test_dc
),
633 .status
= DRSUAPI_DS_NAME_STATUS_OK
636 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
637 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
638 .str
= GUID_string2(mem_ctx
, &priv
->dcinfo
.site_guid
),
639 .comment
= "Site GUID",
640 .expected_str
= priv
->dcinfo
.site_dn
,
641 .status
= DRSUAPI_DS_NAME_STATUS_OK
644 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
645 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
646 .str
= GUID_string2(mem_ctx
, &priv
->dcinfo
.computer_guid
),
647 .comment
= "Computer GUID",
648 .expected_str
= priv
->dcinfo
.computer_dn
,
649 .status
= DRSUAPI_DS_NAME_STATUS_OK
652 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
653 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
654 .str
= GUID_string2(mem_ctx
, &priv
->dcinfo
.computer_guid
),
655 .comment
= "Computer GUID -> NT4 Account",
656 .status
= DRSUAPI_DS_NAME_STATUS_OK
659 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
660 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
661 .str
= GUID_string2(mem_ctx
, &priv
->dcinfo
.server_guid
),
662 .comment
= "Server GUID",
663 .expected_str
= priv
->dcinfo
.server_dn
,
664 .status
= DRSUAPI_DS_NAME_STATUS_OK
667 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
668 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
669 .str
= GUID_string2(mem_ctx
, &priv
->dcinfo
.ntds_guid
),
670 .comment
= "NTDS GUID",
671 .expected_str
= priv
->dcinfo
.ntds_dn
,
672 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
673 .skip
= GUID_all_zero(&priv
->dcinfo
.ntds_guid
)
676 .format_offered
= DRSUAPI_DS_NAME_FORMAT_DISPLAY
,
677 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
679 .comment
= "DISPLAY NAME search for DC short name",
680 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
683 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
684 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
685 .str
= talloc_asprintf(mem_ctx
, "krbtgt/%s", dns_domain
),
686 .comment
= "Looking for KRBTGT as a service principal",
687 .status
= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
,
688 .expected_dns
= dns_domain
691 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
692 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
693 .str
= talloc_asprintf(mem_ctx
, "bogus/%s", dns_domain
),
694 .comment
= "Looking for bogus service principal",
695 .status
= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
,
696 .expected_dns
= dns_domain
699 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
700 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
701 .str
= talloc_asprintf(mem_ctx
, "bogus/%s.%s", test_dc
, dns_domain
),
702 .comment
= "Looking for bogus service on test DC",
703 .status
= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
,
704 .expected_dns
= talloc_asprintf(mem_ctx
, "%s.%s", test_dc
, dns_domain
)
707 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
708 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
709 .str
= talloc_asprintf(mem_ctx
, "krbtgt"),
710 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
713 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
714 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
715 .comment
= "Looking for the kadmin/changepw service as a service principal",
716 .str
= talloc_asprintf(mem_ctx
, "kadmin/changepw"),
717 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
718 .expected_str
= talloc_asprintf(mem_ctx
, "CN=krbtgt,CN=Users,%s", realm_dn_str
),
719 .alternate_status
= DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
722 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
723 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
724 .str
= talloc_asprintf(mem_ctx
, "cifs/%s.%s@%s",
727 .status
= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
730 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
731 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
732 .str
= talloc_asprintf(mem_ctx
, "cifs/%s.%s@%s",
735 .status
= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
,
736 .expected_dns
= "BOGUS"
739 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
740 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
741 .str
= talloc_asprintf(mem_ctx
, "cifs/%s.%s@%s",
744 .status
= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
,
745 .expected_dns
= "BOGUS"
748 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
749 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
750 .str
= talloc_asprintf(mem_ctx
, "cifs/%s.%s",
751 test_dc
, dns_domain
),
752 .status
= DRSUAPI_DS_NAME_STATUS_OK
755 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
756 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
757 .str
= talloc_asprintf(mem_ctx
, "cifs/%s",
759 .status
= DRSUAPI_DS_NAME_STATUS_OK
762 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
763 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
765 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
768 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
769 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
771 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
774 .format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
775 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
776 .str
= "NOT AN NT4 NAME",
777 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
780 .format_offered
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
781 .format_desired
= DRSUAPI_DS_NAME_FORMAT_GUID
,
782 .comment
= "Unparsable DN",
784 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
787 .format_offered
= DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
788 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
789 .comment
= "Unparsable user principal",
790 .str
= "NOT A PRINCIPAL",
791 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
794 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
795 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
796 .comment
= "Unparsable service principal",
797 .str
= "NOT A SERVICE PRINCIPAL",
798 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
801 .format_offered
= DRSUAPI_DS_NAME_FORMAT_GUID
,
802 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
803 .comment
= "BIND GUID (ie, not in the directory)",
804 .str
= DRSUAPI_DS_BIND_GUID
,
805 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
808 .format_offered
= DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
809 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
810 .comment
= "Unqualified Machine account as user principal",
811 .str
= talloc_asprintf(mem_ctx
, "%s$", test_dc
),
812 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
815 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
816 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
817 .comment
= "Machine account as service principal",
818 .str
= talloc_asprintf(mem_ctx
, "%s$", test_dc
),
819 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
822 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL
,
823 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
824 .comment
= "Full Machine account as service principal",
825 .str
= user_principal_name
,
826 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
829 .format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
830 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
831 .comment
= "Realm as an NT4 domain lookup",
832 .str
= talloc_asprintf(mem_ctx
, "%s\\", dns_domain
),
833 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
836 .format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
837 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
838 .comment
= "BUILTIN\\ -> DN",
840 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
843 .format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
844 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
845 .comment
= "NT AUTHORITY\\ -> DN",
846 .str
= "NT AUTHORITY\\",
847 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
850 .format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
851 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
852 .comment
= "NT AUTHORITY\\ANONYMOUS LOGON -> DN",
853 .str
= "NT AUTHORITY\\ANONYMOUS LOGON",
854 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
857 .format_offered
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
858 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
859 .comment
= "NT AUTHORITY\\SYSTEM -> DN",
860 .str
= "NT AUTHORITY\\SYSTEM",
861 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
864 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
865 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
866 .comment
= "BUILTIN SID -> NT4 account",
868 .status
= DRSUAPI_DS_NAME_STATUS_NO_MAPPING
,
869 .alternate_status
= DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
872 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
873 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
875 .comment
= "Builtin Domain SID -> DN",
876 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
877 .expected_str
= talloc_asprintf(mem_ctx
, "CN=Builtin,%s", realm_dn_str
),
878 .alternate_status
= DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
881 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
882 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
883 .str
= SID_BUILTIN_ADMINISTRATORS
,
884 .comment
= "Builtin Administrors SID -> DN",
885 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
886 .alternate_status
= DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
889 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
890 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
891 .str
= SID_BUILTIN_ADMINISTRATORS
,
892 .comment
= "Builtin Administrors SID -> NT4 Account",
893 .status
= DRSUAPI_DS_NAME_STATUS_OK
,
894 .alternate_status
= DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
897 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
898 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
899 .str
= SID_NT_ANONYMOUS
,
900 .comment
= "NT Anonymous SID -> NT4 Account",
901 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
904 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
905 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
906 .str
= SID_NT_SYSTEM
,
907 .comment
= "NT SYSTEM SID -> NT4 Account",
908 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
911 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
912 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
913 .comment
= "Domain SID -> DN",
915 .expected_str
= realm_dn_str
,
916 .status
= DRSUAPI_DS_NAME_STATUS_OK
919 .format_offered
= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY
,
920 .format_desired
= DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT
,
921 .comment
= "Domain SID -> NT4 account",
923 .expected_str
= nt4_domain
,
924 .status
= DRSUAPI_DS_NAME_STATUS_OK
927 .format_offered
= DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
928 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
929 .comment
= "invalid user principal name",
931 .status
= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
,
932 .expected_dns
= "bar"
935 .format_offered
= DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL
,
936 .format_desired
= DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
937 .comment
= "invalid user principal name in valid domain",
938 .str
= talloc_asprintf(mem_ctx
, "invalidusername@%s", dns_domain
),
939 .status
= DRSUAPI_DS_NAME_STATUS_NOT_FOUND
944 for (i
=0; i
< ARRAY_SIZE(crack
); i
++) {
947 torture_comment(tctx
, "Testing DsCrackNames with name '%s'"
948 " offered format: %d desired format:%d\n",
950 crack
[i
].format_offered
,
951 crack
[i
].format_desired
);
953 r
.in
.req
->req1
.format_flags
= crack
[i
].flags
;
954 r
.in
.req
->req1
.format_offered
= crack
[i
].format_offered
;
955 r
.in
.req
->req1
.format_desired
= crack
[i
].format_desired
;
956 names
[0].str
= crack
[i
].str
;
958 if (crack
[i
].comment
) {
959 comment
= talloc_asprintf(mem_ctx
,
960 "'%s' with name '%s' offered format:%d desired format:%d\n",
961 crack
[i
].comment
, names
[0].str
,
962 r
.in
.req
->req1
.format_offered
,
963 r
.in
.req
->req1
.format_desired
);
965 comment
= talloc_asprintf(mem_ctx
, "'%s' offered format:%d desired format:%d\n",
967 r
.in
.req
->req1
.format_offered
,
968 r
.in
.req
->req1
.format_desired
);
971 torture_comment(tctx
, "skipping: %s", comment
);
974 status
= dcerpc_drsuapi_DsCrackNames_r(p
->binding_handle
, mem_ctx
, &r
);
975 if (!NT_STATUS_IS_OK(status
)) {
976 const char *errstr
= nt_errstr(status
);
977 err_msg
= talloc_asprintf(mem_ctx
, "dcerpc_drsuapi_DsCrackNames failed - %s", errstr
);
978 torture_fail(tctx
, err_msg
);
979 } else if (!W_ERROR_IS_OK(r
.out
.result
)) {
980 err_msg
= talloc_asprintf(mem_ctx
, "DsCrackNames failed - %s", win_errstr(r
.out
.result
));
981 torture_fail(tctx
, err_msg
);
982 } else if (r
.out
.ctr
->ctr1
->array
[0].status
!= crack
[i
].status
) {
983 if (crack
[i
].alternate_status
) {
984 if (r
.out
.ctr
->ctr1
->array
[0].status
!= crack
[i
].alternate_status
) {
985 err_msg
= talloc_asprintf(mem_ctx
,
986 "DsCrackNames unexpected status %d, wanted %d or %d on: %s",
987 r
.out
.ctr
->ctr1
->array
[0].status
,
989 crack
[i
].alternate_status
,
991 torture_fail(tctx
, err_msg
);
994 err_msg
= talloc_asprintf(mem_ctx
,
995 "DsCrackNames unexpected status %d, wanted %d on: %s\n",
996 r
.out
.ctr
->ctr1
->array
[0].status
,
999 torture_fail(tctx
, err_msg
);
1001 } else if (crack
[i
].expected_str
&&
1002 (!r
.out
.ctr
->ctr1
->count
||
1003 !r
.out
.ctr
->ctr1
->array
[0].result_name
))
1005 if (!r
.out
.ctr
->ctr1
->count
) {
1006 err_msg
= talloc_asprintf(mem_ctx
,
1007 "DsCrackNames failed - got 0 entries, expected %s on %s",
1008 crack
[i
].expected_str
, comment
);
1009 torture_fail(tctx
, err_msg
);
1011 err_msg
= talloc_asprintf(mem_ctx
,
1012 "DsCrackNames failed - got NULL pointer, expected %s on %s",
1013 crack
[i
].expected_str
, comment
);
1014 torture_fail(tctx
, err_msg
);
1016 } else if (crack
[i
].expected_str
1017 && (strcmp(r
.out
.ctr
->ctr1
->array
[0].result_name
,
1018 crack
[i
].expected_str
) != 0))
1020 if (strcasecmp(r
.out
.ctr
->ctr1
->array
[0].result_name
,
1021 crack
[i
].expected_str
) != 0) {
1022 err_msg
= talloc_asprintf(mem_ctx
,
1023 "DsCrackNames failed - got %s, expected %s on %s",
1024 r
.out
.ctr
->ctr1
->array
[0].result_name
,
1025 crack
[i
].expected_str
, comment
);
1026 torture_fail(tctx
, err_msg
);
1028 torture_comment(tctx
,
1029 "(warning) DsCrackNames returned different case - got %s, expected %s on %s\n",
1030 r
.out
.ctr
->ctr1
->array
[0].result_name
,
1031 crack
[i
].expected_str
, comment
);
1033 } else if (crack
[i
].expected_dns
1034 && (strcmp(r
.out
.ctr
->ctr1
->array
[0].dns_domain_name
,
1035 crack
[i
].expected_dns
) != 0)) {
1036 err_msg
= talloc_asprintf(mem_ctx
,
1037 "DsCrackNames failed - got DNS name %s, expected %s on %s",
1038 r
.out
.ctr
->ctr1
->array
[0].result_name
,
1039 crack
[i
].expected_str
, comment
);
1040 torture_fail(tctx
, err_msg
);
1043 torture_comment(tctx
, "Testing DsCrackNames got %s\n", r
.out
.ctr
->ctr1
->array
[0].result_name
);
1047 return test_DsCrackNamesMatrix(tctx
, priv
, FQDN_1779_name
,
1048 user_principal_name
, service_principal_name
);
1052 * Test case setup for CrackNames
1054 static bool torture_drsuapi_cracknames_setup(struct torture_context
*tctx
, void **data
)
1056 struct DsCrackNamesPrivate
*priv
;
1058 *data
= priv
= talloc_zero(tctx
, struct DsCrackNamesPrivate
);
1060 return torture_drsuapi_tcase_setup_common(tctx
, &priv
->base
);
1064 * Test case tear-down for CrackNames
1066 static bool torture_drsuapi_cracknames_teardown(struct torture_context
*tctx
, void *data
)
1068 struct DsCrackNamesPrivate
*priv
= talloc_get_type(data
, struct DsCrackNamesPrivate
);
1070 return torture_drsuapi_tcase_teardown_common(tctx
, &priv
->base
);
1074 * CRACKNAMES test suite implementation
1076 void torture_rpc_drsuapi_cracknames_tcase(struct torture_suite
*suite
)
1078 typedef bool (*run_func
) (struct torture_context
*test
, void *tcase_data
);
1080 struct torture_tcase
*tcase
= torture_suite_add_tcase(suite
, "cracknames");
1082 torture_tcase_set_fixture(tcase
,
1083 torture_drsuapi_cracknames_setup
,
1084 torture_drsuapi_cracknames_teardown
);
1086 torture_tcase_add_simple_test(tcase
, "cracknames-test", (run_func
)test_DsCrackNames
);