s3-dsgetdcname: add dsgetonedcname()
authorGünther Deschner <gd@samba.org>
Tue, 16 Feb 2021 15:11:14 +0000 (16:11 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 14 Jul 2021 16:49:30 +0000 (16:49 +0000)
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>
source3/libsmb/dsgetdcname.c
source3/libsmb/dsgetdcname.h

index 94f382d03e1be83e9a87f19ffe59db01d051b7ef..f8ae96109b716adecd9be858ef225c8bb514c9c9 100644 (file)
@@ -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;
+}
index 0aa06c32b8364f1d5ff87930572f1975ee7350bb..241b721cf80f484fbe5a81f9a0eced5515cdcf97 100644 (file)
@@ -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