|
261 |
/* |
293 |
/* |
262 |
get all DCs |
294 |
get all DCs |
263 |
*/ |
295 |
*/ |
264 |
static NTSTATUS get_dcs(TALLOC_CTX *ctx, struct ldb_context *ldb, |
296 |
static NTSTATUS get_dcs(TALLOC_CTX *ctx, |
|
|
297 |
struct loadparm_context *lp_ctx, |
298 |
struct ldb_context *ldb, |
299 |
const char *logon_server, |
265 |
const char *searched_site, bool need_fqdn, |
300 |
const char *searched_site, bool need_fqdn, |
266 |
struct dc_set ***pset_list, uint32_t flags) |
301 |
struct dc_set ***pset_list, uint32_t flags) |
267 |
{ |
302 |
{ |
|
285 |
subctx = talloc_new(ctx); |
320 |
subctx = talloc_new(ctx); |
286 |
NT_STATUS_HAVE_NO_MEMORY(subctx); |
321 |
NT_STATUS_HAVE_NO_MEMORY(subctx); |
287 |
|
322 |
|
|
|
323 |
if (logon_server != NULL) { |
324 |
|
325 |
DEBUG(2,(__location__ ": dfs_server_ad: get_dcs realloc\n")); |
326 |
set_list = talloc_realloc(subctx, set_list, struct dc_set *, current_pos+2); |
327 |
DEBUG(2,(__location__ ": dfs_server_ad: get_dcs realloc done\n")); |
328 |
if (set_list == NULL) { |
329 |
TALLOC_FREE(subctx); |
330 |
return NT_STATUS_NO_MEMORY; |
331 |
} |
332 |
set_list[current_pos] = talloc(set_list, struct dc_set); |
333 |
if (set_list[current_pos] == NULL) { |
334 |
TALLOC_FREE(subctx); |
335 |
return NT_STATUS_NO_MEMORY; |
336 |
} |
337 |
set_list[current_pos]->names = NULL; |
338 |
set_list[current_pos]->count = 0; |
339 |
|
340 |
set_list[current_pos+1] = NULL; |
341 |
|
342 |
DEBUG(2,(__location__ ": dfs_server_ad: get_dcs realloc names\n")); |
343 |
set_list[current_pos]->names = talloc_realloc(set_list, set_list[current_pos]->names, const char *, 1); |
344 |
DEBUG(2,(__location__ ": dfs_server_ad: get_dcs realloc names done\n")); |
345 |
if (set_list[current_pos]->names == NULL) { |
346 |
return NT_STATUS_NO_MEMORY; |
347 |
} |
348 |
|
349 |
if (need_fqdn) { |
350 |
struct ldb_result *r; |
351 |
struct ldb_dn *domaindn = ldb_get_default_basedn(ldb); |
352 |
static const char *attrs[] = { "dNSHostName", NULL }; |
353 |
const char *searchfilter = talloc_asprintf(subctx, "(&(objectClass=computer)(sAMAccountName=%s$))", logon_server); |
354 |
|
355 |
ret = ldb_search(ldb, subctx, &r, domaindn, LDB_SCOPE_SUBTREE, attrs, searchfilter); |
356 |
if (ret != LDB_SUCCESS) { |
357 |
DEBUG(2,(__location__ ": Search for computer %s failed - %s\n", |
358 |
logon_server, ldb_errstring(ldb))); |
359 |
talloc_free(subctx); |
360 |
return NT_STATUS_INTERNAL_ERROR; |
361 |
} |
362 |
|
363 |
const char *dns = ldb_msg_find_attr_as_string(r->msgs[0], "dNSHostName", NULL); |
364 |
if (dns == NULL) { |
365 |
DEBUG(2,(__location__ ": dNSHostName missing on %s\n", |
366 |
ldb_dn_get_linearized(r->msgs[0]->dn))); |
367 |
talloc_free(subctx); |
368 |
talloc_free(r); |
369 |
return NT_STATUS_INTERNAL_ERROR; |
370 |
} |
371 |
|
372 |
set_list[current_pos]->names[0] = talloc_strdup(set_list, dns); |
373 |
if (set_list[current_pos]->names[0] == NULL) { |
374 |
talloc_free(subctx); |
375 |
talloc_free(r); |
376 |
return NT_STATUS_NO_MEMORY; |
377 |
} |
378 |
talloc_free(r); |
379 |
} else { |
380 |
set_list[current_pos]->names[0] = talloc_strdup(set_list, logon_server); |
381 |
if (set_list[current_pos]->names[0] == NULL) { |
382 |
talloc_free(subctx); |
383 |
return NT_STATUS_NO_MEMORY; |
384 |
} |
385 |
} |
386 |
|
387 |
set_list[current_pos]->count = 1; |
388 |
current_pos++; |
389 |
} |
390 |
|
288 |
configdn = ldb_get_config_basedn(ldb); |
391 |
configdn = ldb_get_config_basedn(ldb); |
289 |
|
392 |
|
290 |
/* Let's search for the Site container */ |
393 |
/* Let's search for the Site container */ |
|
556 |
|
676 |
|
557 |
site_name = samdb_client_site_name(sam_ctx, r, client_str, NULL); |
677 |
site_name = samdb_client_site_name(sam_ctx, r, client_str, NULL); |
558 |
|
678 |
|
559 |
status = get_dcs(r, sam_ctx, site_name, need_fqdn, &set, 0); |
679 |
status = get_dcs(r, lp_ctx, sam_ctx, NULL, site_name, need_fqdn, &set, 0); |
560 |
if (!NT_STATUS_IS_OK(status)) { |
680 |
if (!NT_STATUS_IS_OK(status)) { |
561 |
DEBUG(3,("Unable to get list of DCs - %s\n", |
681 |
DEBUG(3,("Unable to get list of DCs - %s\n", |
562 |
nt_errstr(status))); |
682 |
nt_errstr(status))); |
|
629 |
static NTSTATUS dosysvol_referral(struct loadparm_context *lp_ctx, |
749 |
static NTSTATUS dosysvol_referral(struct loadparm_context *lp_ctx, |
630 |
struct ldb_context *sam_ctx, |
750 |
struct ldb_context *sam_ctx, |
631 |
const struct tsocket_address *client, |
751 |
const struct tsocket_address *client, |
|
|
752 |
const char *logon_server, |
632 |
struct dfs_GetDFSReferral *r, |
753 |
struct dfs_GetDFSReferral *r, |
633 |
const char *domain_name, |
754 |
const char *domain_name, |
634 |
const char *dfs_name) |
755 |
const char *dfs_name) |
|
667 |
|
788 |
|
668 |
site_name = samdb_client_site_name(sam_ctx, r, client_str, NULL); |
789 |
site_name = samdb_client_site_name(sam_ctx, r, client_str, NULL); |
669 |
|
790 |
|
670 |
status = get_dcs(r, sam_ctx, site_name, need_fqdn, &set, 0); |
791 |
status = get_dcs(r, lp_ctx, sam_ctx, logon_server, site_name, need_fqdn, &set, 0); |
671 |
if (!NT_STATUS_IS_OK(status)) { |
792 |
if (!NT_STATUS_IS_OK(status)) { |
672 |
DEBUG(3,("Unable to get list of DCs - %s\n", |
793 |
DEBUG(3,("Unable to get list of DCs - %s\n", |
673 |
nt_errstr(status))); |
794 |
nt_errstr(status))); |
|
741 |
*/ |
862 |
*/ |
742 |
NTSTATUS dfs_server_ad_get_referrals(struct loadparm_context *lp_ctx, |
863 |
NTSTATUS dfs_server_ad_get_referrals(struct loadparm_context *lp_ctx, |
743 |
struct ldb_context *sam_ctx, |
864 |
struct ldb_context *sam_ctx, |
|
|
865 |
const char *logon_server, |
744 |
const struct tsocket_address *client, |
866 |
const struct tsocket_address *client, |
745 |
struct dfs_GetDFSReferral *r) |
867 |
struct dfs_GetDFSReferral *r) |
746 |
{ |
868 |
{ |
|
889 |
*/ |
1011 |
*/ |
890 |
if (strcasecmp(dfs_name, "sysvol") == 0 || |
1012 |
if (strcasecmp(dfs_name, "sysvol") == 0 || |
891 |
strcasecmp(dfs_name, "netlogon") == 0) { |
1013 |
strcasecmp(dfs_name, "netlogon") == 0) { |
892 |
return dosysvol_referral(lp_ctx, sam_ctx, client, r, |
1014 |
return dosysvol_referral(lp_ctx, sam_ctx, client, logon_server, r, |
893 |
server_name, dfs_name); |
1015 |
server_name, dfs_name); |
894 |
} |
1016 |
} |
895 |
|
1017 |
|