diff options
author | Günther Deschner <gd@samba.org> | 2021-02-16 16:11:14 +0100 |
---|---|---|
committer | Günther Deschner <gd@samba.org> | 2021-07-14 16:49:30 +0000 |
commit | 7a9972943a45a803950eb322449f8f88066cec16 (patch) | |
tree | 975f7c59bd4751a66e7a8d8ab697b90f7f3a6e0f | |
parent | de3296203914df6240e146aa114ef2e1ae3d6315 (diff) | |
download | samba-7a9972943a45a803950eb322449f8f88066cec16.tar.gz |
s3-dsgetdcname: add dsgetonedcname()
The idea is to run the same DC validation steps as for dsgetdcname()
just omit the query list of DCs via DNS/netbios step but instead
validate a given DC right away.
Guenther
Signed-off-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Alexander Bokovoy <ab@samba.org>
-rw-r--r-- | source3/libsmb/dsgetdcname.c | 53 | ||||
-rw-r--r-- | source3/libsmb/dsgetdcname.h | 6 |
2 files changed, 59 insertions, 0 deletions
diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 94f382d03e1..f8ae96109b7 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -1212,3 +1212,56 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, return status; } + +NTSTATUS dsgetonedcname(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, + const char *domain_name, + const char *dcname, + uint32_t flags, + struct netr_DsRGetDCNameInfo **info) +{ + NTSTATUS status; + struct sockaddr_storage *addrs; + unsigned int num_addrs, i; + const char *hostname = strip_hostname(dcname); + + status = resolve_name_list(mem_ctx, hostname, 0x20, + &addrs, &num_addrs); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + for (i = 0; i < num_addrs; i++) { + + bool ok; + struct ip_service_name dclist; + + dclist.hostname = hostname; + ok = sockaddr_storage_to_samba_sockaddr(&dclist.sa, &addrs[i]); + if (!ok) { + TALLOC_FREE(addrs); + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + } + + status = process_dc_dns(mem_ctx, domain_name, flags, + &dclist, 1, info); + if (NT_STATUS_IS_OK(status)) { + TALLOC_FREE(addrs); + return NT_STATUS_OK; + } + + if (lp_disable_netbios()) { + continue; + } + + status = process_dc_netbios(mem_ctx, msg_ctx, domain_name, flags, + &dclist, 1, info); + if (NT_STATUS_IS_OK(status)) { + TALLOC_FREE(addrs); + return NT_STATUS_OK; + } + } + + TALLOC_FREE(addrs); + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; +} diff --git a/source3/libsmb/dsgetdcname.h b/source3/libsmb/dsgetdcname.h index 0aa06c32b83..241b721cf80 100644 --- a/source3/libsmb/dsgetdcname.h +++ b/source3/libsmb/dsgetdcname.h @@ -34,4 +34,10 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, uint32_t flags, struct netr_DsRGetDCNameInfo **info); +NTSTATUS dsgetonedcname(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, + const char *domain_name, + const char *dcname, + uint32_t flags, + struct netr_DsRGetDCNameInfo **info); #endif |