From 84bce05e71720a54aa87900bd6550576317d52cb Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 28 Aug 2007 15:01:23 +0000 Subject: r24742: Add experimental DsGetDcName() call (will be used by krb5 locator for fine grained KDC DNS queries). Guenther (This used to be commit 3263cd680fe429430d789b284464fca72ef45719) --- source3/libsmb/dsgetdcname.c | 955 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 955 insertions(+) create mode 100644 source3/libsmb/dsgetdcname.c (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c new file mode 100644 index 0000000000..6f4961b3c3 --- /dev/null +++ b/source3/libsmb/dsgetdcname.c @@ -0,0 +1,955 @@ +/* + Unix SMB/CIFS implementation. + + DsGetDcname + + Copyright (C) Gerald Carter 2006 + Copyright (C) Guenther Deschner 2007 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" + +#define DSGETDCNAME_FMT "DSGETDCNAME/DOMAIN/%s" +/* 15 minutes */ +#define DSGETDCNAME_CACHE_TTL 60*15 + +struct ip_service_name { + struct in_addr ip; + unsigned port; + const char *hostname; +}; + +/**************************************************************** +****************************************************************/ + +void debug_dsdcinfo_flags(int lvl, uint32_t flags) +{ + DEBUG(lvl,("debug_dsdcinfo_flags: 0x%08x\n\t", flags)); + + if (flags & DS_FORCE_REDISCOVERY) + DEBUGADD(lvl,("DS_FORCE_REDISCOVERY ")); + if (flags & 0x000000002) + DEBUGADD(lvl,("0x00000002 ")); + if (flags & 0x000000004) + DEBUGADD(lvl,("0x00000004 ")); + if (flags & 0x000000008) + DEBUGADD(lvl,("0x00000008 ")); + if (flags & DS_DIRECTORY_SERVICE_REQUIRED) + DEBUGADD(lvl,("DS_DIRECTORY_SERVICE_REQUIRED ")); + if (flags & DS_DIRECTORY_SERVICE_PREFERRED) + DEBUGADD(lvl,("DS_DIRECTORY_SERVICE_PREFERRED ")); + if (flags & DS_GC_SERVER_REQUIRED) + DEBUGADD(lvl,("DS_GC_SERVER_REQUIRED ")); + if (flags & DS_PDC_REQUIRED) + DEBUGADD(lvl,("DS_PDC_REQUIRED ")); + if (flags & DS_BACKGROUND_ONLY) + DEBUGADD(lvl,("DS_BACKGROUND_ONLY ")); + if (flags & DS_IP_REQUIRED) + DEBUGADD(lvl,("DS_IP_REQUIRED ")); + if (flags & DS_KDC_REQUIRED) + DEBUGADD(lvl,("DS_KDC_REQUIRED ")); + if (flags & DS_TIMESERV_REQUIRED) + DEBUGADD(lvl,("DS_TIMESERV_REQUIRED ")); + if (flags & DS_WRITABLE_REQUIRED) + DEBUGADD(lvl,("DS_WRITABLE_REQUIRED ")); + if (flags & DS_GOOD_TIMESERV_PREFERRED) + DEBUGADD(lvl,("DS_GOOD_TIMESERV_PREFERRED ")); + if (flags & DS_AVOID_SELF) + DEBUGADD(lvl,("DS_AVOID_SELF ")); + if (flags & DS_ONLY_LDAP_NEEDED) + DEBUGADD(lvl,("DS_ONLY_LDAP_NEEDED ")); + if (flags & 0x00010000) + DEBUGADD(lvl,("0x00010000 ")); + if (flags & 0x00020000) + DEBUGADD(lvl,("0x00020000 ")); + if (flags & 0x00040000) + DEBUGADD(lvl,("0x00040000 ")); + if (flags & 0x00080000) + DEBUGADD(lvl,("0x00080000 ")); + if (flags & DS_IS_FLAT_NAME) + DEBUGADD(lvl,("DS_IS_FLAT_NAME ")); + if (flags & DS_IS_DNS_NAME) + DEBUGADD(lvl,("DS_IS_DNS_NAME ")); + if (flags & 0x00040000) + DEBUGADD(lvl,("0x00040000 ")); + if (flags & 0x00080000) + DEBUGADD(lvl,("0x00080000 ")); + if (flags & 0x00100000) + DEBUGADD(lvl,("0x00100000 ")); + if (flags & 0x00200000) + DEBUGADD(lvl,("0x00200000 ")); + if (flags & 0x00400000) + DEBUGADD(lvl,("0x00400000 ")); + if (flags & 0x00800000) + DEBUGADD(lvl,("0x00800000 ")); + if (flags & 0x01000000) + DEBUGADD(lvl,("0x01000000 ")); + if (flags & 0x02000000) + DEBUGADD(lvl,("0x02000000 ")); + if (flags & 0x04000000) + DEBUGADD(lvl,("0x04000000 ")); + if (flags & 0x08000000) + DEBUGADD(lvl,("0x08000000 ")); + if (flags & 0x10000000) + DEBUGADD(lvl,("0x10000000 ")); + if (flags & 0x20000000) + DEBUGADD(lvl,("0x20000000 ")); + if (flags & DS_RETURN_DNS_NAME) + DEBUGADD(lvl,("DS_RETURN_DNS_NAME ")); + if (flags & DS_RETURN_FLAT_NAME) + DEBUGADD(lvl,("DS_RETURN_FLAT_NAME ")); + if (flags) + DEBUGADD(lvl,("\n")); +} + +/********************************************************************* + ********************************************************************/ + +static int pack_dsdcinfo(struct DS_DOMAIN_CONTROLLER_INFO *info, + unsigned char **buf) +{ + unsigned char *buffer = NULL; + int len = 0; + int buflen = 0; + UUID_FLAT guid_flat; + + DEBUG(10,("pack_dsdcinfo: Packing dsdcinfo\n")); + + ZERO_STRUCT(guid_flat); + + if (info->domain_guid) { + const struct GUID *guid = info->domain_guid; + smb_uuid_pack(*guid, &guid_flat); + } + + again: + len = 0; + + if (buflen > 0) { + DEBUG(10,("pack_dsdcinfo: Packing domain %s (%s)\n", + info->domain_name, info->domain_controller_name)); + } + + len += tdb_pack(buffer+len, buflen-len, "ffdBffdff", + info->domain_controller_name, + info->domain_controller_address, + info->domain_controller_address_type, + UUID_FLAT_SIZE, guid_flat.info, + info->domain_name, + info->dns_forest_name, + info->flags, + info->dc_site_name, + info->client_site_name); + + if (buflen < len) { + SAFE_FREE(buffer); + if ((buffer = SMB_MALLOC_ARRAY(unsigned char, len)) == NULL ) { + DEBUG(0,("pack_dsdcinfo: failed to alloc buffer!\n")); + buflen = -1; + goto done; + } + buflen = len; + goto again; + } + + *buf = buffer; + + done: + return buflen; +} + +/********************************************************************* + ********************************************************************/ + +static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, + unsigned char *buf, + int buflen, + struct DS_DOMAIN_CONTROLLER_INFO **info_ret) +{ + int len = 0; + struct DS_DOMAIN_CONTROLLER_INFO *info = NULL; + uint32_t guid_len = 0; + unsigned char *guid_buf = NULL; + UUID_FLAT guid_flat; + + /* forgive me 6 times */ + fstring domain_controller_name; + fstring domain_controller_address; + fstring domain_name; + fstring dns_forest_name; + fstring dc_site_name; + fstring client_site_name; + + info = TALLOC_ZERO_P(mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO); + NT_STATUS_HAVE_NO_MEMORY(info); + + len += tdb_unpack(buf+len, buflen-len, "ffdBffdff", + &domain_controller_name, + &domain_controller_address, + &info->domain_controller_address_type, + &guid_len, &guid_buf, + &domain_name, + &dns_forest_name, + &info->flags, + &dc_site_name, + &client_site_name); + if (len == -1) { + DEBUG(5,("unpack_dsdcinfo: Failed to unpack domain\n")); + goto failed; + } + + info->domain_controller_name = + talloc_strdup(mem_ctx, domain_controller_name); + info->domain_controller_address = + talloc_strdup(mem_ctx, domain_controller_address); + info->domain_name = + talloc_strdup(mem_ctx, domain_name); + info->dns_forest_name = + talloc_strdup(mem_ctx, dns_forest_name); + info->dc_site_name = + talloc_strdup(mem_ctx, dc_site_name); + info->client_site_name = + talloc_strdup(mem_ctx, client_site_name); + + if (!info->domain_controller_name || + !info->domain_controller_address || + !info->domain_name || + !info->dns_forest_name || + !info->dc_site_name || + !info->client_site_name) { + goto failed; + } + + if (guid_len > 0) { + struct GUID guid; + + if (guid_len != UUID_FLAT_SIZE) { + goto failed; + } + + memcpy(&guid_flat.info, guid_buf, guid_len); + smb_uuid_unpack(guid_flat, &guid); + + info->domain_guid = talloc_memdup(mem_ctx, &guid, sizeof(guid)); + if (!info->domain_guid) { + goto failed; + } + SAFE_FREE(guid_buf); + } + + DEBUG(10,("unpack_dcscinfo: Unpacked domain %s (%s)\n", + info->domain_name, info->domain_controller_name)); + + *info_ret = info; + + return NT_STATUS_OK; + + failed: + TALLOC_FREE(info); + SAFE_FREE(guid_buf); + return NT_STATUS_NO_MEMORY; +} + +/**************************************************************** +****************************************************************/ + +static char *DsGetDcName_cache_key(TALLOC_CTX *mem_ctx, const char *domain) +{ + if (!mem_ctx || !domain) { + return NULL; + } + + return talloc_asprintf(mem_ctx, DSGETDCNAME_FMT, + strupper_static(domain)); +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS DsGetDcName_cache_delete(TALLOC_CTX *mem_ctx, + const char *domain_name) +{ + char *key; + + if (!gencache_init()) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + + key = DsGetDcName_cache_key(mem_ctx, domain_name); + if (!key) { + return NT_STATUS_NO_MEMORY; + } + + if (!gencache_del(key)) { + return NT_STATUS_UNSUCCESSFUL; + } + + return NT_STATUS_OK; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS DsGetDcName_cache_store(TALLOC_CTX *mem_ctx, + const char *domain_name, + struct DS_DOMAIN_CONTROLLER_INFO *info) +{ + time_t expire_time; + char *key; + BOOL ret = False; + DATA_BLOB blob; + unsigned char *buf = NULL; + int len = 0; + + if (!gencache_init()) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + + key = DsGetDcName_cache_key(mem_ctx, domain_name); + if (!key) { + return NT_STATUS_NO_MEMORY; + } + + expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; + + len = pack_dsdcinfo(info, &buf); + if (len == -1) { + return NT_STATUS_UNSUCCESSFUL; + } + + blob = data_blob(buf, len); + SAFE_FREE(buf); + + if (gencache_lock_entry(key) != 0) { + data_blob_free(&blob); + return NT_STATUS_LOCK_NOT_GRANTED; + } + + ret = gencache_set_data_blob(key, &blob, expire_time); + data_blob_free(&blob); + + gencache_unlock_entry(key); + + return ret ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS DsGetDcName_cache_refresh(TALLOC_CTX *mem_ctx, + const char *domain_name, + struct GUID *domain_guid, + uint32_t flags, + const char *site_name, + struct DS_DOMAIN_CONTROLLER_INFO *info) +{ + struct cldap_netlogon_reply r; + + /* check if matching entry is older then 15 minutes, if yes, send + * CLDAP/MAILSLOT ping again and store the cached data */ + + ZERO_STRUCT(r); + + if (ads_cldap_netlogon(info->domain_controller_name, + info->domain_name, &r)) { + + DsGetDcName_cache_delete(mem_ctx, domain_name); + + return DsGetDcName_cache_store(mem_ctx, + info->domain_name, + info); + } + + return NT_STATUS_INVALID_NETWORK_RESPONSE; +} + +/**************************************************************** +****************************************************************/ + +#define RETURN_ON_FALSE(x) if (!x) return False; + +static BOOL check_cldap_reply_required_flags(uint32_t ret_flags, + uint32_t req_flags) +{ + if (req_flags & DS_PDC_REQUIRED) + RETURN_ON_FALSE(ret_flags & ADS_PDC); + + if (req_flags & DS_GC_SERVER_REQUIRED) + RETURN_ON_FALSE(ret_flags & ADS_GC); + + if (req_flags & DS_ONLY_LDAP_NEEDED) + RETURN_ON_FALSE(ret_flags & ADS_LDAP); + + if ((req_flags & DS_DIRECTORY_SERVICE_REQUIRED) || + (req_flags & DS_DIRECTORY_SERVICE_PREFERRED)) + RETURN_ON_FALSE(ret_flags & ADS_DS); + + if (req_flags & DS_KDC_REQUIRED) + RETURN_ON_FALSE(ret_flags & ADS_KDC); + + if (req_flags & DS_TIMESERV_REQUIRED) + RETURN_ON_FALSE(ret_flags & ADS_TIMESERV); + + if (req_flags & DS_WRITABLE_REQUIRED) + RETURN_ON_FALSE(ret_flags & ADS_WRITABLE); + + return True; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS DsGetDcName_cache_fetch(TALLOC_CTX *mem_ctx, + const char *domain_name, + struct GUID *domain_guid, + uint32_t flags, + const char *site_name, + struct DS_DOMAIN_CONTROLLER_INFO **info, + BOOL *expired) +{ + char *key; + DATA_BLOB blob; + NTSTATUS status; + + if (!gencache_init()) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + + key = DsGetDcName_cache_key(mem_ctx, domain_name); + if (!key) { + return NT_STATUS_NO_MEMORY; + } + + if (!gencache_get_data_blob(key, &blob, expired)) { + return NT_STATUS_OBJECT_NAME_NOT_FOUND; + } + + status = unpack_dsdcinfo(mem_ctx, blob.data, blob.length, info); + if (!NT_STATUS_IS_OK(status)) { + data_blob_free(&blob); + return status; + } + + data_blob_free(&blob); + + /* check flags */ + if (!check_cldap_reply_required_flags((*info)->flags, flags)) { + DEBUG(10,("invalid flags\n")); + return NT_STATUS_INVALID_PARAMETER; + } + + if ((flags & DS_IP_REQUIRED) && + !((*info)->domain_controller_address_type != ADS_INET_ADDRESS)) { + return NT_STATUS_INVALID_PARAMETER_MIX; + } + + return NT_STATUS_OK; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS DsGetDcName_cached(TALLOC_CTX *mem_ctx, + const char *domain_name, + struct GUID *domain_guid, + uint32_t flags, + const char *site_name, + struct DS_DOMAIN_CONTROLLER_INFO **info) +{ + NTSTATUS status; + BOOL expired = False; + + status = DsGetDcName_cache_fetch(mem_ctx, domain_name, domain_guid, + flags, site_name, info, &expired); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(10,("DsGetDcName_cached: cache fetch failed with: %s\n", + nt_errstr(status))); + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + } + + if (flags & DS_BACKGROUND_ONLY) { + return status; + } + + if (expired) { + status = DsGetDcName_cache_refresh(mem_ctx, domain_name, + domain_guid, flags, + site_name, *info); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + } + + return status; +} + +/**************************************************************** +****************************************************************/ + +static BOOL check_allowed_required_flags(uint32_t flags) +{ + uint32_t return_type = flags & (DS_RETURN_FLAT_NAME|DS_RETURN_DNS_NAME); + uint32_t offered_type = flags & (DS_IS_FLAT_NAME|DS_IS_DNS_NAME); + uint32_t query_type = flags & (DS_BACKGROUND_ONLY|DS_FORCE_REDISCOVERY); + + /* FIXME: check for DSGETDC_VALID_FLAGS and check for excluse bits + * (DS_PDC_REQUIRED, DS_KDC_REQUIRED, DS_GC_SERVER_REQUIRED) */ + + debug_dsdcinfo_flags(0, flags); + + if (return_type == (DS_RETURN_FLAT_NAME|DS_RETURN_DNS_NAME)) { + return False; + } + + if (offered_type == (DS_IS_DNS_NAME|DS_IS_FLAT_NAME)) { + return False; + } + + if (query_type == (DS_BACKGROUND_ONLY|DS_FORCE_REDISCOVERY)) { + return False; + } + +#if 0 + if ((flags & DS_RETURN_DNS_NAME) && (!(flags & DS_IP_REQUIRED))) { + printf("gd: here5 \n"); + return False; + } +#endif + return True; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS discover_dc_netbios(TALLOC_CTX *mem_ctx, + const char *domain_name, + uint32_t flags, + struct ip_service_name **returned_dclist, + int *return_count) +{ + if (lp_disable_netbios()) { + return NT_STATUS_NOT_SUPPORTED; + } + + /* FIXME: code here */ + + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, + const char *domain_name, + struct GUID *domain_guid, + uint32_t flags, + const char *site_name, + struct ip_service_name **returned_dclist, + int *return_count) +{ + int i, j; + NTSTATUS status; + struct dns_rr_srv *dcs = NULL; + int numdcs = 0; + int numaddrs = 0; + + if ((!(flags & DS_DIRECTORY_SERVICE_REQUIRED)) && + (!(flags & DS_KDC_REQUIRED)) && + (!(flags & DS_GC_SERVER_REQUIRED)) && + (!(flags & DS_PDC_REQUIRED))) { + DEBUG(1,("discover_dc_dns: invalid flags\n")); + return NT_STATUS_INVALID_PARAMETER; + } + + if (flags & DS_PDC_REQUIRED) { + status = ads_dns_query_pdc(mem_ctx, domain_name, + &dcs, &numdcs); + } else if (flags & DS_GC_SERVER_REQUIRED) { + status = ads_dns_query_gcs(mem_ctx, domain_name, site_name, + &dcs, &numdcs); + } else if (flags & DS_KDC_REQUIRED) { + status = ads_dns_query_kdcs(mem_ctx, domain_name, site_name, + &dcs, &numdcs); + } else if (flags & DS_DIRECTORY_SERVICE_REQUIRED) { + status = ads_dns_query_dcs(mem_ctx, domain_name, site_name, + &dcs, &numdcs); + } else if (domain_guid) { + status = ads_dns_query_dcs_guid(mem_ctx, domain_name, + domain_guid, &dcs, &numdcs); + } else { + /* FIXME: ? */ + DEBUG(1,("discover_dc_dns: not enough input\n")); + status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + } + + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + if (numdcs == 0) { + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + } + + for (i=0;iport = dcs[i].port; + r->hostname = dcs[i].hostname; + + if (!(flags & DS_IP_REQUIRED)) { + (*return_count)++; + continue; + } + + /* If we don't have an IP list for a name, lookup it up */ + + if (!dcs[i].ips) { + r->ip = *interpret_addr2(dcs[i].hostname); + i++; + j = 0; + } else { + /* use the IP addresses from the SRV sresponse */ + + if (j >= dcs[i].num_ips) { + i++; + j = 0; + continue; + } + + r->ip = dcs[i].ips[j]; + j++; + } + + /* make sure it is a valid IP. I considered checking the + * negative connection cache, but this is the wrong place for + * it. Maybe only as a hac. After think about it, if all of + * the IP addresses retuend from DNS are dead, what hope does a + * netbios name lookup have? The standard reason for falling + * back to netbios lookups is that our DNS server doesn't know + * anything about the DC's -- jerry */ + + if (!is_zero_ip(r->ip)) { + (*return_count)++; + continue; + } + } + + return (*return_count > 0) ? NT_STATUS_OK : + NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, + const char *domain_controller_name, + const char *domain_controller_address, + uint32_t domain_controller_address_type, + const struct GUID *domain_guid, + const char *domain_name, + const char *dns_forest_name, + uint32_t flags, + const char *dc_site_name, + const char *client_site_name, + struct DS_DOMAIN_CONTROLLER_INFO **info_out) +{ + struct DS_DOMAIN_CONTROLLER_INFO *info; + + info = TALLOC_ZERO_P(mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO); + NT_STATUS_HAVE_NO_MEMORY(info); + + if (domain_controller_name) { + info->domain_controller_name = talloc_strdup(mem_ctx, + domain_controller_name); + NT_STATUS_HAVE_NO_MEMORY(info->domain_controller_name); + } + + if (domain_controller_address) { + info->domain_controller_address = talloc_strdup(mem_ctx, + domain_controller_address); + NT_STATUS_HAVE_NO_MEMORY(info->domain_controller_address); + } + + info->domain_controller_address_type = domain_controller_address_type; + + if (domain_guid) { + info->domain_guid = talloc_memdup(mem_ctx, domain_guid, + sizeof(*domain_guid)); + NT_STATUS_HAVE_NO_MEMORY(info->domain_guid); + } + + if (domain_name) { + info->domain_name = talloc_strdup(mem_ctx, domain_name); + NT_STATUS_HAVE_NO_MEMORY(info->domain_name); + } + + if (dns_forest_name) { + info->dns_forest_name = talloc_strdup(mem_ctx, + dns_forest_name); + NT_STATUS_HAVE_NO_MEMORY(info->dns_forest_name); + } + + info->flags = flags; + + if (dc_site_name) { + info->dc_site_name = talloc_strdup(mem_ctx, dc_site_name); + NT_STATUS_HAVE_NO_MEMORY(info->dc_site_name); + } + + if (client_site_name) { + info->client_site_name = talloc_strdup(mem_ctx, + client_site_name); + NT_STATUS_HAVE_NO_MEMORY(info->client_site_name); + } + + *info_out = info; + + return NT_STATUS_OK; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, + const char *domain_name, + uint32_t flags, + struct ip_service_name **dclist, + int num_dcs, + struct DS_DOMAIN_CONTROLLER_INFO **info) +{ + int i = 0; + BOOL valid_dc = False; + struct cldap_netlogon_reply r; + const char *dc_hostname, *dc_domain_name; + const char *dc_address; + uint32_t dc_address_type; + uint32_t dc_flags; + struct GUID dc_guid; + + for (i=0; ihostname, + domain_name, &r)) && + (check_cldap_reply_required_flags(r.flags, flags))) { + valid_dc = True; + break; + } + + continue; + } + + if (!valid_dc) { + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + } + + dc_flags = r.flags; + + if (flags & DS_RETURN_FLAT_NAME) { + if (!strlen(r.netbios_hostname) || !strlen(r.netbios_domain)) { + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + } + dc_hostname = r.netbios_hostname; + dc_domain_name = r.netbios_domain; + } else if (flags & DS_RETURN_DNS_NAME) { + if (!strlen(r.hostname) || !strlen(r.domain)) { + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + } + dc_hostname = r.hostname; + dc_domain_name = r.domain; + dc_flags |= ADS_DNS_DOMAIN | ADS_DNS_CONTROLLER; + } else { + /* FIXME */ + dc_hostname = r.hostname; + dc_domain_name = r.domain; + dc_flags |= ADS_DNS_DOMAIN | ADS_DNS_CONTROLLER; + } + + if (flags & DS_IP_REQUIRED) { + dc_address = talloc_asprintf(mem_ctx, "\\\\%s", + inet_ntoa(dclist[i]->ip)); + dc_address_type = ADS_INET_ADDRESS; + } else { + dc_address = talloc_asprintf(mem_ctx, "\\\\%s", + r.netbios_hostname); + dc_address_type = ADS_NETBIOS_ADDRESS; + } + NT_STATUS_HAVE_NO_MEMORY(dc_address); + dc_guid = smb_uuid_unpack_static(r.guid); + + if (r.forest) { + dc_flags |= ADS_DNS_FOREST; + } + + return make_domain_controller_info(mem_ctx, + dc_hostname, + dc_address, + dc_address_type, + &dc_guid, + dc_domain_name, + r.forest, + dc_flags, + r.server_site_name, + r.client_site_name, + info); + +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, + const char *domain_name, + uint32_t flags, + struct ip_service_name **dclist, + int num_dcs, + struct DS_DOMAIN_CONTROLLER_INFO **info) +{ + /* FIXME: code here */ + + return NT_STATUS_NOT_SUPPORTED; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS DsGetDcName_rediscover(TALLOC_CTX *mem_ctx, + const char *domain_name, + struct GUID *domain_guid, + uint32_t flags, + const char *site_name, + struct DS_DOMAIN_CONTROLLER_INFO **info) +{ + NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + struct ip_service_name *dclist; + int num_dcs; + + DEBUG(10,("DsGetDcName_rediscover\n")); + + if (flags & DS_IS_FLAT_NAME) { + + status = discover_dc_netbios(mem_ctx, domain_name, flags, + &dclist, &num_dcs); + NT_STATUS_NOT_OK_RETURN(status); + + return process_dc_netbios(mem_ctx, domain_name, flags, + &dclist, num_dcs, info); + } + + if (flags & DS_IS_DNS_NAME) { + + status = discover_dc_dns(mem_ctx, domain_name, domain_guid, + flags, site_name, &dclist, &num_dcs); + NT_STATUS_NOT_OK_RETURN(status); + + return process_dc_dns(mem_ctx, domain_name, flags, + &dclist, num_dcs, info); + } + + status = discover_dc_dns(mem_ctx, domain_name, domain_guid, flags, + site_name, &dclist, &num_dcs); + + if (NT_STATUS_IS_OK(status) && num_dcs != 0) { + + status = process_dc_dns(mem_ctx, domain_name, flags, &dclist, + num_dcs, info); + if (NT_STATUS_IS_OK(status)) { + return status; + } + } + + status = discover_dc_netbios(mem_ctx, domain_name, flags, &dclist, + &num_dcs); + NT_STATUS_NOT_OK_RETURN(status); + + return process_dc_netbios(mem_ctx, domain_name, flags, &dclist, + num_dcs, info); +} + +/******************************************************************** + DsGetDcName. + + This will be the only public function here. +********************************************************************/ + +NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, + const char *computer_name, + const char *domain_name, + struct GUID *domain_guid, + const char *site_name, + uint32_t flags, + struct DS_DOMAIN_CONTROLLER_INFO **info) +{ + NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + struct DS_DOMAIN_CONTROLLER_INFO *myinfo = NULL; + + DEBUG(10,("DsGetDcName: computer_name: %s, domain_name: %s, " + "domain_guid: %s, site_name: %s, flags: 0x%08x\n", + computer_name, domain_name, + domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", + site_name, flags)); + + *info = NULL; + + if (!check_allowed_required_flags(flags)) { + DEBUG(0,("invalid flags specified\n")); + return NT_STATUS_INVALID_PARAMETER; + } + + if (flags & DS_FORCE_REDISCOVERY) { + goto rediscover; + } + + status = DsGetDcName_cached(mem_ctx, domain_name, domain_guid, + flags, site_name, &myinfo); + if (NT_STATUS_IS_OK(status)) { + *info = myinfo; + return status; + } + + if (flags & DS_BACKGROUND_ONLY) { + return status; + } + + rediscover: + status = DsGetDcName_rediscover(mem_ctx, domain_name, + domain_guid, flags, site_name, + &myinfo); + + if (NT_STATUS_IS_OK(status)) { + DsGetDcName_cache_store(mem_ctx, domain_name, myinfo); + *info = myinfo; + } + + return status; +} -- cgit From 52cd23c92a21edd7b70a0f7b3aca0176bdf520c7 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 28 Aug 2007 15:31:42 +0000 Subject: r24749: Increase debuglevel. Guenther (This used to be commit d82c1638b8ada43cfcbf9f71586c4c6849902c7e) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 6f4961b3c3..4cb3d1beac 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -508,7 +508,7 @@ static BOOL check_allowed_required_flags(uint32_t flags) /* FIXME: check for DSGETDC_VALID_FLAGS and check for excluse bits * (DS_PDC_REQUIRED, DS_KDC_REQUIRED, DS_GC_SERVER_REQUIRED) */ - debug_dsdcinfo_flags(0, flags); + debug_dsdcinfo_flags(10, flags); if (return_type == (DS_RETURN_FLAT_NAME|DS_RETURN_DNS_NAME)) { return False; -- cgit From 4429a01c83f8900d318c7c162f004d1e5764556a Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 29 Aug 2007 12:35:20 +0000 Subject: r24776: Remove accidentially commited flag checks. Guenther (This used to be commit 1efc5009a4b72a5a4c600ca3af7dc7cf05f74353) --- source3/libsmb/dsgetdcname.c | 8 -------- 1 file changed, 8 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 4cb3d1beac..3d8d57d157 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -71,14 +71,6 @@ void debug_dsdcinfo_flags(int lvl, uint32_t flags) DEBUGADD(lvl,("DS_AVOID_SELF ")); if (flags & DS_ONLY_LDAP_NEEDED) DEBUGADD(lvl,("DS_ONLY_LDAP_NEEDED ")); - if (flags & 0x00010000) - DEBUGADD(lvl,("0x00010000 ")); - if (flags & 0x00020000) - DEBUGADD(lvl,("0x00020000 ")); - if (flags & 0x00040000) - DEBUGADD(lvl,("0x00040000 ")); - if (flags & 0x00080000) - DEBUGADD(lvl,("0x00080000 ")); if (flags & DS_IS_FLAT_NAME) DEBUGADD(lvl,("DS_IS_FLAT_NAME ")); if (flags & DS_IS_DNS_NAME) -- cgit From 1a13b09894ea8f6424cb904c83a4cd6214040e89 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 29 Aug 2007 13:56:52 +0000 Subject: r24782: Fix C++ warnings (This used to be commit f7e8df81ef9e1deadb1251e5e5959e90a4432f40) --- source3/libsmb/dsgetdcname.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 3d8d57d157..90e6d49274 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -235,7 +235,8 @@ static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, memcpy(&guid_flat.info, guid_buf, guid_len); smb_uuid_unpack(guid_flat, &guid); - info->domain_guid = talloc_memdup(mem_ctx, &guid, sizeof(guid)); + info->domain_guid = (struct GUID *)talloc_memdup( + mem_ctx, &guid, sizeof(guid)); if (!info->domain_guid) { goto failed; } @@ -694,8 +695,8 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, info->domain_controller_address_type = domain_controller_address_type; if (domain_guid) { - info->domain_guid = talloc_memdup(mem_ctx, domain_guid, - sizeof(*domain_guid)); + info->domain_guid = (struct GUID *)talloc_memdup( + mem_ctx, domain_guid, sizeof(*domain_guid)); NT_STATUS_HAVE_NO_MEMORY(info->domain_guid); } -- cgit From b79f9b087054fd3b5c5cddfc89e4c56434309d34 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 30 Aug 2007 09:15:07 +0000 Subject: r24797: Fix logic in dsgetdcname(). Guenther (This used to be commit aca2d78db139ed32bcedec9861e83cb8c42809cf) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 90e6d49274..384b9ec48d 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -445,7 +445,7 @@ static NTSTATUS DsGetDcName_cache_fetch(TALLOC_CTX *mem_ctx, } if ((flags & DS_IP_REQUIRED) && - !((*info)->domain_controller_address_type != ADS_INET_ADDRESS)) { + ((*info)->domain_controller_address_type != ADS_INET_ADDRESS)) { return NT_STATUS_INVALID_PARAMETER_MIX; } -- cgit From 8e54530b52fd256137740107e9fdf000f00a7a30 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 10 Oct 2007 18:25:16 -0700 Subject: Add start of IPv6 implementation. Currently most of this is avoiding IPv6 in winbindd, but moves most of the socket functions that were wrongly in lib/util.c into lib/util_sock.c and provides generic IPv4/6 independent versions of most things. Still lots of work to do, but now I can see how I'll fix the access check code. Nasty part that remains is the name resolution code which is used to returning arrays of in_addr structs. Jeremy. (This used to be commit 3f6bd0e1ec5cc6670f3d08f76fc2cd94c9cd1a08) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 384b9ec48d..89bb65006d 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -650,7 +650,7 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, * back to netbios lookups is that our DNS server doesn't know * anything about the DC's -- jerry */ - if (!is_zero_ip(r->ip)) { + if (!is_zero_ip_v4(r->ip)) { (*return_count)++; continue; } -- cgit From 30191d1a5704ad2b158386b511558972d539ce47 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 18 Oct 2007 17:40:25 -0700 Subject: RIP BOOL. Convert BOOL -> bool. I found a few interesting bugs in various places whilst doing this (places that assumed BOOL == int). I also need to fix the Samba4 pidl generation (next checkin). Jeremy. (This used to be commit f35a266b3cbb3e5fa6a86be60f34fe340a3ca71f) --- source3/libsmb/dsgetdcname.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 89bb65006d..bffbd0f8dc 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -302,7 +302,7 @@ static NTSTATUS DsGetDcName_cache_store(TALLOC_CTX *mem_ctx, { time_t expire_time; char *key; - BOOL ret = False; + bool ret = False; DATA_BLOB blob; unsigned char *buf = NULL; int len = 0; @@ -374,7 +374,7 @@ static NTSTATUS DsGetDcName_cache_refresh(TALLOC_CTX *mem_ctx, #define RETURN_ON_FALSE(x) if (!x) return False; -static BOOL check_cldap_reply_required_flags(uint32_t ret_flags, +static bool check_cldap_reply_required_flags(uint32_t ret_flags, uint32_t req_flags) { if (req_flags & DS_PDC_REQUIRED) @@ -411,7 +411,7 @@ static NTSTATUS DsGetDcName_cache_fetch(TALLOC_CTX *mem_ctx, uint32_t flags, const char *site_name, struct DS_DOMAIN_CONTROLLER_INFO **info, - BOOL *expired) + bool *expired) { char *key; DATA_BLOB blob; @@ -463,7 +463,7 @@ static NTSTATUS DsGetDcName_cached(TALLOC_CTX *mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO **info) { NTSTATUS status; - BOOL expired = False; + bool expired = False; status = DsGetDcName_cache_fetch(mem_ctx, domain_name, domain_guid, flags, site_name, info, &expired); @@ -492,7 +492,7 @@ static NTSTATUS DsGetDcName_cached(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -static BOOL check_allowed_required_flags(uint32_t flags) +static bool check_allowed_required_flags(uint32_t flags) { uint32_t return_type = flags & (DS_RETURN_FLAT_NAME|DS_RETURN_DNS_NAME); uint32_t offered_type = flags & (DS_IS_FLAT_NAME|DS_IS_DNS_NAME); @@ -740,7 +740,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO **info) { int i = 0; - BOOL valid_dc = False; + bool valid_dc = False; struct cldap_netlogon_reply r; const char *dc_hostname, *dc_domain_name; const char *dc_address; -- cgit From e2d0526c9799a75f87bbbe24f2e5a268df89fea9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 29 Oct 2007 13:34:00 -0700 Subject: Change our DNS code to cope with AAAA records. A6 records look like a nightmare to use, so ignore them for now. Jeremy. (This used to be commit 814daded90781dc5a5bdd522ea8cfe5d47e6d7a7) --- source3/libsmb/dsgetdcname.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index bffbd0f8dc..f6c3273084 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -27,7 +27,7 @@ #define DSGETDCNAME_CACHE_TTL 60*15 struct ip_service_name { - struct in_addr ip; + struct sockaddr_storage ss; unsigned port; const char *hostname; }; @@ -625,8 +625,8 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, /* If we don't have an IP list for a name, lookup it up */ - if (!dcs[i].ips) { - r->ip = *interpret_addr2(dcs[i].hostname); + if (!dcs[i].ss_s) { + interpret_string_addr(&r->ss, dcs[i].hostname, 0); i++; j = 0; } else { @@ -638,7 +638,7 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, continue; } - r->ip = dcs[i].ips[j]; + r->ss = dcs[i].ss_s[j]; j++; } @@ -650,7 +650,7 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, * back to netbios lookups is that our DNS server doesn't know * anything about the DC's -- jerry */ - if (!is_zero_ip_v4(r->ip)) { + if (!is_zero_addr(&r->ss)) { (*return_count)++; continue; } @@ -789,8 +789,10 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, } if (flags & DS_IP_REQUIRED) { + char addr[INET6_ADDRSTRLEN]; + print_sockaddr(addr, sizeof(addr), &dclist[i]->ss); dc_address = talloc_asprintf(mem_ctx, "\\\\%s", - inet_ntoa(dclist[i]->ip)); + addr); dc_address_type = ADS_INET_ADDRESS; } else { dc_address = talloc_asprintf(mem_ctx, "\\\\%s", -- cgit From 1011b32678c7b32472a909b9f515698947d2a389 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 25 Nov 2007 10:10:52 +0100 Subject: Remove some statics (This used to be commit 1fab16ffb888cd4ec18e52d9da33976a67a5d104) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index f6c3273084..b0870e249e 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -800,7 +800,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, dc_address_type = ADS_NETBIOS_ADDRESS; } NT_STATUS_HAVE_NO_MEMORY(dc_address); - dc_guid = smb_uuid_unpack_static(r.guid); + smb_uuid_unpack(r.guid, &dc_guid); if (r.forest) { dc_flags |= ADS_DNS_FOREST; -- cgit From 78c6ee0090f4122bc25baaacb5546517ad4b7bc6 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 24 Nov 2007 17:27:54 +0100 Subject: Remove some globals (This used to be commit 31d0a846db08d845e6cdfd85def4ac1c34031e02) --- source3/libsmb/dsgetdcname.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index b0870e249e..f8089cbd6a 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -265,8 +265,7 @@ static char *DsGetDcName_cache_key(TALLOC_CTX *mem_ctx, const char *domain) return NULL; } - return talloc_asprintf(mem_ctx, DSGETDCNAME_FMT, - strupper_static(domain)); + return talloc_asprintf_strupper_m(mem_ctx, DSGETDCNAME_FMT, domain); } /**************************************************************** -- cgit From a8d200893a0a7bfbd5a33a52fbe47c4d14a6ed50 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 7 Jan 2008 23:05:58 +0100 Subject: Refactor our DsGetDcName call a bit (before it will move into libnetapi). Guenther (This used to be commit 41c129da3d33f9fc2864d360e4b6ec5a72caf2a3) --- source3/libsmb/dsgetdcname.c | 117 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 101 insertions(+), 16 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index f8089cbd6a..fa6cbe146f 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -4,7 +4,7 @@ DsGetDcname Copyright (C) Gerald Carter 2006 - Copyright (C) Guenther Deschner 2007 + Copyright (C) Guenther Deschner 2007-2008 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -891,28 +891,72 @@ static NTSTATUS DsGetDcName_rediscover(TALLOC_CTX *mem_ctx, } /******************************************************************** - DsGetDcName. +********************************************************************/ - This will be the only public function here. +NTSTATUS DsGetDcName_remote(TALLOC_CTX *mem_ctx, + const char *computer_name, + const char *domain_name, + struct GUID *domain_guid, + const char *site_name, + uint32_t flags, + struct DS_DOMAIN_CONTROLLER_INFO **info) +{ + WERROR werr; + NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + struct cli_state *cli = NULL; + struct rpc_pipe_client *pipe_cli = NULL; + + status = cli_full_connection(&cli, NULL, computer_name, + NULL, 0, + "IPC$", "IPC", + "", + "", + "", + 0, Undefined, NULL); + + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + + pipe_cli = cli_rpc_pipe_open_noauth(cli, PI_NETLOGON, + &status); + if (!pipe_cli) { + goto done; + } + + werr = rpccli_netlogon_dsr_getdcname(pipe_cli, + mem_ctx, + computer_name, + domain_name, + domain_guid, + NULL, + flags, + info); + status = werror_to_ntstatus(werr); + + done: + cli_rpc_pipe_close(pipe_cli); + if (cli) { + cli_shutdown(cli); + } + + return status; +} + +/******************************************************************** ********************************************************************/ -NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, - const char *computer_name, - const char *domain_name, - struct GUID *domain_guid, - const char *site_name, - uint32_t flags, - struct DS_DOMAIN_CONTROLLER_INFO **info) +NTSTATUS DsGetDcName_local(TALLOC_CTX *mem_ctx, + const char *computer_name, + const char *domain_name, + struct GUID *domain_guid, + const char *site_name, + uint32_t flags, + struct DS_DOMAIN_CONTROLLER_INFO **info) { NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; struct DS_DOMAIN_CONTROLLER_INFO *myinfo = NULL; - DEBUG(10,("DsGetDcName: computer_name: %s, domain_name: %s, " - "domain_guid: %s, site_name: %s, flags: 0x%08x\n", - computer_name, domain_name, - domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", - site_name, flags)); - *info = NULL; if (!check_allowed_required_flags(flags)) { @@ -947,3 +991,44 @@ NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, return status; } + +/******************************************************************** + DsGetDcName. + + This will be the only public function here. +********************************************************************/ + +NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, + const char *computer_name, + const char *domain_name, + struct GUID *domain_guid, + const char *site_name, + uint32_t flags, + struct DS_DOMAIN_CONTROLLER_INFO **info) +{ + DEBUG(10,("DsGetDcName: computer_name: %s, domain_name: %s, " + "domain_guid: %s, site_name: %s, flags: 0x%08x\n", + computer_name, domain_name, + domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", + site_name, flags)); + + *info = NULL; + + if (computer_name) { + return DsGetDcName_remote(mem_ctx, + computer_name, + domain_name, + domain_guid, + site_name, + flags, + info); + } + + return DsGetDcName_local(mem_ctx, + computer_name, + domain_name, + domain_guid, + site_name, + flags, + info); +} -- cgit From c79ce2ffa3f7d00ce6a2cd6008c203e3042b0b02 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 11 Jan 2008 15:32:20 +0100 Subject: As long as DsGetDcName is not part of libnetapi, lowercase the fn name. Guenther (This used to be commit 19a980f52044a170618629e5b0484c1f6b586e5f) --- source3/libsmb/dsgetdcname.c | 76 ++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 38 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index fa6cbe146f..2a66d51400 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -1,7 +1,7 @@ /* Unix SMB/CIFS implementation. - DsGetDcname + dsgetdcname Copyright (C) Gerald Carter 2006 Copyright (C) Guenther Deschner 2007-2008 @@ -259,7 +259,7 @@ static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -static char *DsGetDcName_cache_key(TALLOC_CTX *mem_ctx, const char *domain) +static char *dsgetdcname_cache_key(TALLOC_CTX *mem_ctx, const char *domain) { if (!mem_ctx || !domain) { return NULL; @@ -271,7 +271,7 @@ static char *DsGetDcName_cache_key(TALLOC_CTX *mem_ctx, const char *domain) /**************************************************************** ****************************************************************/ -static NTSTATUS DsGetDcName_cache_delete(TALLOC_CTX *mem_ctx, +static NTSTATUS dsgetdcname_cache_delete(TALLOC_CTX *mem_ctx, const char *domain_name) { char *key; @@ -280,7 +280,7 @@ static NTSTATUS DsGetDcName_cache_delete(TALLOC_CTX *mem_ctx, return NT_STATUS_INTERNAL_DB_ERROR; } - key = DsGetDcName_cache_key(mem_ctx, domain_name); + key = dsgetdcname_cache_key(mem_ctx, domain_name); if (!key) { return NT_STATUS_NO_MEMORY; } @@ -295,13 +295,13 @@ static NTSTATUS DsGetDcName_cache_delete(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -static NTSTATUS DsGetDcName_cache_store(TALLOC_CTX *mem_ctx, +static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, const char *domain_name, struct DS_DOMAIN_CONTROLLER_INFO *info) { time_t expire_time; char *key; - bool ret = False; + bool ret = false; DATA_BLOB blob; unsigned char *buf = NULL; int len = 0; @@ -310,7 +310,7 @@ static NTSTATUS DsGetDcName_cache_store(TALLOC_CTX *mem_ctx, return NT_STATUS_INTERNAL_DB_ERROR; } - key = DsGetDcName_cache_key(mem_ctx, domain_name); + key = dsgetdcname_cache_key(mem_ctx, domain_name); if (!key) { return NT_STATUS_NO_MEMORY; } @@ -341,7 +341,7 @@ static NTSTATUS DsGetDcName_cache_store(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -static NTSTATUS DsGetDcName_cache_refresh(TALLOC_CTX *mem_ctx, +static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, const char *domain_name, struct GUID *domain_guid, uint32_t flags, @@ -358,9 +358,9 @@ static NTSTATUS DsGetDcName_cache_refresh(TALLOC_CTX *mem_ctx, if (ads_cldap_netlogon(info->domain_controller_name, info->domain_name, &r)) { - DsGetDcName_cache_delete(mem_ctx, domain_name); + dsgetdcname_cache_delete(mem_ctx, domain_name); - return DsGetDcName_cache_store(mem_ctx, + return dsgetdcname_cache_store(mem_ctx, info->domain_name, info); } @@ -371,7 +371,7 @@ static NTSTATUS DsGetDcName_cache_refresh(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -#define RETURN_ON_FALSE(x) if (!x) return False; +#define RETURN_ON_FALSE(x) if (!x) return false; static bool check_cldap_reply_required_flags(uint32_t ret_flags, uint32_t req_flags) @@ -398,13 +398,13 @@ static bool check_cldap_reply_required_flags(uint32_t ret_flags, if (req_flags & DS_WRITABLE_REQUIRED) RETURN_ON_FALSE(ret_flags & ADS_WRITABLE); - return True; + return true; } /**************************************************************** ****************************************************************/ -static NTSTATUS DsGetDcName_cache_fetch(TALLOC_CTX *mem_ctx, +static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, const char *domain_name, struct GUID *domain_guid, uint32_t flags, @@ -420,7 +420,7 @@ static NTSTATUS DsGetDcName_cache_fetch(TALLOC_CTX *mem_ctx, return NT_STATUS_INTERNAL_DB_ERROR; } - key = DsGetDcName_cache_key(mem_ctx, domain_name); + key = dsgetdcname_cache_key(mem_ctx, domain_name); if (!key) { return NT_STATUS_NO_MEMORY; } @@ -454,7 +454,7 @@ static NTSTATUS DsGetDcName_cache_fetch(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -static NTSTATUS DsGetDcName_cached(TALLOC_CTX *mem_ctx, +static NTSTATUS dsgetdcname_cached(TALLOC_CTX *mem_ctx, const char *domain_name, struct GUID *domain_guid, uint32_t flags, @@ -462,12 +462,12 @@ static NTSTATUS DsGetDcName_cached(TALLOC_CTX *mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO **info) { NTSTATUS status; - bool expired = False; + bool expired = false; - status = DsGetDcName_cache_fetch(mem_ctx, domain_name, domain_guid, + status = dsgetdcname_cache_fetch(mem_ctx, domain_name, domain_guid, flags, site_name, info, &expired); if (!NT_STATUS_IS_OK(status)) { - DEBUG(10,("DsGetDcName_cached: cache fetch failed with: %s\n", + DEBUG(10,("dsgetdcname_cached: cache fetch failed with: %s\n", nt_errstr(status))); return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; } @@ -477,7 +477,7 @@ static NTSTATUS DsGetDcName_cached(TALLOC_CTX *mem_ctx, } if (expired) { - status = DsGetDcName_cache_refresh(mem_ctx, domain_name, + status = dsgetdcname_cache_refresh(mem_ctx, domain_name, domain_guid, flags, site_name, *info); if (!NT_STATUS_IS_OK(status)) { @@ -503,24 +503,24 @@ static bool check_allowed_required_flags(uint32_t flags) debug_dsdcinfo_flags(10, flags); if (return_type == (DS_RETURN_FLAT_NAME|DS_RETURN_DNS_NAME)) { - return False; + return false; } if (offered_type == (DS_IS_DNS_NAME|DS_IS_FLAT_NAME)) { - return False; + return false; } if (query_type == (DS_BACKGROUND_ONLY|DS_FORCE_REDISCOVERY)) { - return False; + return false; } #if 0 if ((flags & DS_RETURN_DNS_NAME) && (!(flags & DS_IP_REQUIRED))) { printf("gd: here5 \n"); - return False; + return false; } #endif - return True; + return true; } /**************************************************************** @@ -739,7 +739,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO **info) { int i = 0; - bool valid_dc = False; + bool valid_dc = false; struct cldap_netlogon_reply r; const char *dc_hostname, *dc_domain_name; const char *dc_address; @@ -754,7 +754,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, if ((ads_cldap_netlogon(dclist[i]->hostname, domain_name, &r)) && (check_cldap_reply_required_flags(r.flags, flags))) { - valid_dc = True; + valid_dc = true; break; } @@ -837,7 +837,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -static NTSTATUS DsGetDcName_rediscover(TALLOC_CTX *mem_ctx, +static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, const char *domain_name, struct GUID *domain_guid, uint32_t flags, @@ -848,7 +848,7 @@ static NTSTATUS DsGetDcName_rediscover(TALLOC_CTX *mem_ctx, struct ip_service_name *dclist; int num_dcs; - DEBUG(10,("DsGetDcName_rediscover\n")); + DEBUG(10,("dsgetdcname_rediscover\n")); if (flags & DS_IS_FLAT_NAME) { @@ -893,7 +893,7 @@ static NTSTATUS DsGetDcName_rediscover(TALLOC_CTX *mem_ctx, /******************************************************************** ********************************************************************/ -NTSTATUS DsGetDcName_remote(TALLOC_CTX *mem_ctx, +NTSTATUS dsgetdcname_remote(TALLOC_CTX *mem_ctx, const char *computer_name, const char *domain_name, struct GUID *domain_guid, @@ -946,7 +946,7 @@ NTSTATUS DsGetDcName_remote(TALLOC_CTX *mem_ctx, /******************************************************************** ********************************************************************/ -NTSTATUS DsGetDcName_local(TALLOC_CTX *mem_ctx, +NTSTATUS dsgetdcname_local(TALLOC_CTX *mem_ctx, const char *computer_name, const char *domain_name, struct GUID *domain_guid, @@ -968,7 +968,7 @@ NTSTATUS DsGetDcName_local(TALLOC_CTX *mem_ctx, goto rediscover; } - status = DsGetDcName_cached(mem_ctx, domain_name, domain_guid, + status = dsgetdcname_cached(mem_ctx, domain_name, domain_guid, flags, site_name, &myinfo); if (NT_STATUS_IS_OK(status)) { *info = myinfo; @@ -980,12 +980,12 @@ NTSTATUS DsGetDcName_local(TALLOC_CTX *mem_ctx, } rediscover: - status = DsGetDcName_rediscover(mem_ctx, domain_name, + status = dsgetdcname_rediscover(mem_ctx, domain_name, domain_guid, flags, site_name, &myinfo); if (NT_STATUS_IS_OK(status)) { - DsGetDcName_cache_store(mem_ctx, domain_name, myinfo); + dsgetdcname_cache_store(mem_ctx, domain_name, myinfo); *info = myinfo; } @@ -993,12 +993,12 @@ NTSTATUS DsGetDcName_local(TALLOC_CTX *mem_ctx, } /******************************************************************** - DsGetDcName. + dsgetdcname. This will be the only public function here. ********************************************************************/ -NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, +NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, const char *computer_name, const char *domain_name, struct GUID *domain_guid, @@ -1006,7 +1006,7 @@ NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, uint32_t flags, struct DS_DOMAIN_CONTROLLER_INFO **info) { - DEBUG(10,("DsGetDcName: computer_name: %s, domain_name: %s, " + DEBUG(10,("dsgetdcname: computer_name: %s, domain_name: %s, " "domain_guid: %s, site_name: %s, flags: 0x%08x\n", computer_name, domain_name, domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", @@ -1015,7 +1015,7 @@ NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, *info = NULL; if (computer_name) { - return DsGetDcName_remote(mem_ctx, + return dsgetdcname_remote(mem_ctx, computer_name, domain_name, domain_guid, @@ -1024,7 +1024,7 @@ NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx, info); } - return DsGetDcName_local(mem_ctx, + return dsgetdcname_local(mem_ctx, computer_name, domain_name, domain_guid, -- cgit From 5ab43ae0d8e66a1fd4c877089df52282367be7dd Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sat, 26 Jan 2008 01:39:33 +0100 Subject: Eliminate remote tree of dsgetdcname (which will happen in libnetapi then). Guenther (This used to be commit fd490d236b1fb73a75c457b75128c9b98719418f) --- source3/libsmb/dsgetdcname.c | 114 ++++++------------------------------------- 1 file changed, 14 insertions(+), 100 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 2a66d51400..e0be76cc85 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -891,72 +891,27 @@ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, } /******************************************************************** -********************************************************************/ - -NTSTATUS dsgetdcname_remote(TALLOC_CTX *mem_ctx, - const char *computer_name, - const char *domain_name, - struct GUID *domain_guid, - const char *site_name, - uint32_t flags, - struct DS_DOMAIN_CONTROLLER_INFO **info) -{ - WERROR werr; - NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; - struct cli_state *cli = NULL; - struct rpc_pipe_client *pipe_cli = NULL; - - status = cli_full_connection(&cli, NULL, computer_name, - NULL, 0, - "IPC$", "IPC", - "", - "", - "", - 0, Undefined, NULL); - - if (!NT_STATUS_IS_OK(status)) { - goto done; - } - - pipe_cli = cli_rpc_pipe_open_noauth(cli, PI_NETLOGON, - &status); - if (!pipe_cli) { - goto done; - } - - werr = rpccli_netlogon_dsr_getdcname(pipe_cli, - mem_ctx, - computer_name, - domain_name, - domain_guid, - NULL, - flags, - info); - status = werror_to_ntstatus(werr); - - done: - cli_rpc_pipe_close(pipe_cli); - if (cli) { - cli_shutdown(cli); - } - - return status; -} + dsgetdcname. -/******************************************************************** + This will be the only public function here. ********************************************************************/ -NTSTATUS dsgetdcname_local(TALLOC_CTX *mem_ctx, - const char *computer_name, - const char *domain_name, - struct GUID *domain_guid, - const char *site_name, - uint32_t flags, - struct DS_DOMAIN_CONTROLLER_INFO **info) +NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, + const char *domain_name, + struct GUID *domain_guid, + const char *site_name, + uint32_t flags, + struct DS_DOMAIN_CONTROLLER_INFO **info) { NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; struct DS_DOMAIN_CONTROLLER_INFO *myinfo = NULL; + DEBUG(10,("dsgetdcname: domain_name: %s, " + "domain_guid: %s, site_name: %s, flags: 0x%08x\n", + domain_name, + domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", + site_name, flags)); + *info = NULL; if (!check_allowed_required_flags(flags)) { @@ -991,44 +946,3 @@ NTSTATUS dsgetdcname_local(TALLOC_CTX *mem_ctx, return status; } - -/******************************************************************** - dsgetdcname. - - This will be the only public function here. -********************************************************************/ - -NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, - const char *computer_name, - const char *domain_name, - struct GUID *domain_guid, - const char *site_name, - uint32_t flags, - struct DS_DOMAIN_CONTROLLER_INFO **info) -{ - DEBUG(10,("dsgetdcname: computer_name: %s, domain_name: %s, " - "domain_guid: %s, site_name: %s, flags: 0x%08x\n", - computer_name, domain_name, - domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", - site_name, flags)); - - *info = NULL; - - if (computer_name) { - return dsgetdcname_remote(mem_ctx, - computer_name, - domain_name, - domain_guid, - site_name, - flags, - info); - } - - return dsgetdcname_local(mem_ctx, - computer_name, - domain_name, - domain_guid, - site_name, - flags, - info); -} -- cgit From 0d8985f2da43d35d8f940af112ad74a199778dd8 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 28 Feb 2008 12:30:18 +0100 Subject: Let dsgetdcname() return a struct netr_DsRGetDCNameInfo. Guenther (This used to be commit b1a4b21f8c35dc23e5c986ebe44d3806055eb39b) --- source3/libsmb/dsgetdcname.c | 144 ++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 77 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index e0be76cc85..bc9f4b92c8 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -110,7 +110,7 @@ void debug_dsdcinfo_flags(int lvl, uint32_t flags) /********************************************************************* ********************************************************************/ -static int pack_dsdcinfo(struct DS_DOMAIN_CONTROLLER_INFO *info, +static int pack_dsdcinfo(struct netr_DsRGetDCNameInfo *info, unsigned char **buf) { unsigned char *buffer = NULL; @@ -122,9 +122,8 @@ static int pack_dsdcinfo(struct DS_DOMAIN_CONTROLLER_INFO *info, ZERO_STRUCT(guid_flat); - if (info->domain_guid) { - const struct GUID *guid = info->domain_guid; - smb_uuid_pack(*guid, &guid_flat); + if (!GUID_all_zero(&info->domain_guid)) { + smb_uuid_pack(info->domain_guid, &guid_flat); } again: @@ -132,17 +131,17 @@ static int pack_dsdcinfo(struct DS_DOMAIN_CONTROLLER_INFO *info, if (buflen > 0) { DEBUG(10,("pack_dsdcinfo: Packing domain %s (%s)\n", - info->domain_name, info->domain_controller_name)); + info->domain_name, info->dc_unc)); } len += tdb_pack(buffer+len, buflen-len, "ffdBffdff", - info->domain_controller_name, - info->domain_controller_address, - info->domain_controller_address_type, + info->dc_unc, + info->dc_address, + info->dc_address_type, UUID_FLAT_SIZE, guid_flat.info, info->domain_name, - info->dns_forest_name, - info->flags, + info->forest_name, + info->dc_flags, info->dc_site_name, info->client_site_name); @@ -169,33 +168,33 @@ static int pack_dsdcinfo(struct DS_DOMAIN_CONTROLLER_INFO *info, static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, unsigned char *buf, int buflen, - struct DS_DOMAIN_CONTROLLER_INFO **info_ret) + struct netr_DsRGetDCNameInfo **info_ret) { int len = 0; - struct DS_DOMAIN_CONTROLLER_INFO *info = NULL; + struct netr_DsRGetDCNameInfo *info = NULL; uint32_t guid_len = 0; unsigned char *guid_buf = NULL; UUID_FLAT guid_flat; /* forgive me 6 times */ - fstring domain_controller_name; - fstring domain_controller_address; + fstring dc_unc; + fstring dc_address; fstring domain_name; - fstring dns_forest_name; + fstring forest_name; fstring dc_site_name; fstring client_site_name; - info = TALLOC_ZERO_P(mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO); + info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo); NT_STATUS_HAVE_NO_MEMORY(info); len += tdb_unpack(buf+len, buflen-len, "ffdBffdff", - &domain_controller_name, - &domain_controller_address, - &info->domain_controller_address_type, + &dc_unc, + &dc_address, + &info->dc_address_type, &guid_len, &guid_buf, &domain_name, - &dns_forest_name, - &info->flags, + &forest_name, + &info->dc_flags, &dc_site_name, &client_site_name); if (len == -1) { @@ -203,23 +202,23 @@ static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, goto failed; } - info->domain_controller_name = - talloc_strdup(mem_ctx, domain_controller_name); - info->domain_controller_address = - talloc_strdup(mem_ctx, domain_controller_address); + info->dc_unc = + talloc_strdup(mem_ctx, dc_unc); + info->dc_address = + talloc_strdup(mem_ctx, dc_address); info->domain_name = talloc_strdup(mem_ctx, domain_name); - info->dns_forest_name = - talloc_strdup(mem_ctx, dns_forest_name); + info->forest_name = + talloc_strdup(mem_ctx, forest_name); info->dc_site_name = talloc_strdup(mem_ctx, dc_site_name); info->client_site_name = talloc_strdup(mem_ctx, client_site_name); - if (!info->domain_controller_name || - !info->domain_controller_address || + if (!info->dc_unc || + !info->dc_address || !info->domain_name || - !info->dns_forest_name || + !info->forest_name || !info->dc_site_name || !info->client_site_name) { goto failed; @@ -235,16 +234,12 @@ static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, memcpy(&guid_flat.info, guid_buf, guid_len); smb_uuid_unpack(guid_flat, &guid); - info->domain_guid = (struct GUID *)talloc_memdup( - mem_ctx, &guid, sizeof(guid)); - if (!info->domain_guid) { - goto failed; - } + info->domain_guid = guid; SAFE_FREE(guid_buf); } DEBUG(10,("unpack_dcscinfo: Unpacked domain %s (%s)\n", - info->domain_name, info->domain_controller_name)); + info->domain_name, info->dc_unc)); *info_ret = info; @@ -297,7 +292,7 @@ static NTSTATUS dsgetdcname_cache_delete(TALLOC_CTX *mem_ctx, static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, const char *domain_name, - struct DS_DOMAIN_CONTROLLER_INFO *info) + struct netr_DsRGetDCNameInfo *info) { time_t expire_time; char *key; @@ -346,7 +341,7 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, struct GUID *domain_guid, uint32_t flags, const char *site_name, - struct DS_DOMAIN_CONTROLLER_INFO *info) + struct netr_DsRGetDCNameInfo *info) { struct cldap_netlogon_reply r; @@ -355,7 +350,7 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, ZERO_STRUCT(r); - if (ads_cldap_netlogon(info->domain_controller_name, + if (ads_cldap_netlogon(info->dc_unc, info->domain_name, &r)) { dsgetdcname_cache_delete(mem_ctx, domain_name); @@ -409,7 +404,7 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, struct GUID *domain_guid, uint32_t flags, const char *site_name, - struct DS_DOMAIN_CONTROLLER_INFO **info, + struct netr_DsRGetDCNameInfo **info, bool *expired) { char *key; @@ -438,13 +433,13 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, data_blob_free(&blob); /* check flags */ - if (!check_cldap_reply_required_flags((*info)->flags, flags)) { + if (!check_cldap_reply_required_flags((*info)->dc_flags, flags)) { DEBUG(10,("invalid flags\n")); return NT_STATUS_INVALID_PARAMETER; } if ((flags & DS_IP_REQUIRED) && - ((*info)->domain_controller_address_type != ADS_INET_ADDRESS)) { + ((*info)->dc_address_type != DS_ADDRESS_TYPE_INET)) { return NT_STATUS_INVALID_PARAMETER_MIX; } @@ -459,7 +454,7 @@ static NTSTATUS dsgetdcname_cached(TALLOC_CTX *mem_ctx, struct GUID *domain_guid, uint32_t flags, const char *site_name, - struct DS_DOMAIN_CONTROLLER_INFO **info) + struct netr_DsRGetDCNameInfo **info) { NTSTATUS status; bool expired = false; @@ -663,40 +658,36 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, ****************************************************************/ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, - const char *domain_controller_name, - const char *domain_controller_address, - uint32_t domain_controller_address_type, + const char *dc_unc, + const char *dc_address, + uint32_t dc_address_type, const struct GUID *domain_guid, const char *domain_name, - const char *dns_forest_name, + const char *forest_name, uint32_t flags, const char *dc_site_name, const char *client_site_name, - struct DS_DOMAIN_CONTROLLER_INFO **info_out) + struct netr_DsRGetDCNameInfo **info_out) { - struct DS_DOMAIN_CONTROLLER_INFO *info; + struct netr_DsRGetDCNameInfo *info; - info = TALLOC_ZERO_P(mem_ctx, struct DS_DOMAIN_CONTROLLER_INFO); + info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo); NT_STATUS_HAVE_NO_MEMORY(info); - if (domain_controller_name) { - info->domain_controller_name = talloc_strdup(mem_ctx, - domain_controller_name); - NT_STATUS_HAVE_NO_MEMORY(info->domain_controller_name); + if (dc_unc) { + info->dc_unc = talloc_strdup(mem_ctx, dc_unc); + NT_STATUS_HAVE_NO_MEMORY(info->dc_unc); } - if (domain_controller_address) { - info->domain_controller_address = talloc_strdup(mem_ctx, - domain_controller_address); - NT_STATUS_HAVE_NO_MEMORY(info->domain_controller_address); + if (dc_address) { + info->dc_address = talloc_strdup(mem_ctx, dc_address); + NT_STATUS_HAVE_NO_MEMORY(info->dc_address); } - info->domain_controller_address_type = domain_controller_address_type; + info->dc_address_type = dc_address_type; if (domain_guid) { - info->domain_guid = (struct GUID *)talloc_memdup( - mem_ctx, domain_guid, sizeof(*domain_guid)); - NT_STATUS_HAVE_NO_MEMORY(info->domain_guid); + info->domain_guid = *domain_guid; } if (domain_name) { @@ -704,13 +695,12 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, NT_STATUS_HAVE_NO_MEMORY(info->domain_name); } - if (dns_forest_name) { - info->dns_forest_name = talloc_strdup(mem_ctx, - dns_forest_name); - NT_STATUS_HAVE_NO_MEMORY(info->dns_forest_name); + if (forest_name) { + info->forest_name = talloc_strdup(mem_ctx, forest_name); + NT_STATUS_HAVE_NO_MEMORY(info->forest_name); } - info->flags = flags; + info->dc_flags = flags; if (dc_site_name) { info->dc_site_name = talloc_strdup(mem_ctx, dc_site_name); @@ -736,7 +726,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, uint32_t flags, struct ip_service_name **dclist, int num_dcs, - struct DS_DOMAIN_CONTROLLER_INFO **info) + struct netr_DsRGetDCNameInfo **info) { int i = 0; bool valid_dc = false; @@ -779,12 +769,12 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, } dc_hostname = r.hostname; dc_domain_name = r.domain; - dc_flags |= ADS_DNS_DOMAIN | ADS_DNS_CONTROLLER; + dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; } else { /* FIXME */ dc_hostname = r.hostname; dc_domain_name = r.domain; - dc_flags |= ADS_DNS_DOMAIN | ADS_DNS_CONTROLLER; + dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; } if (flags & DS_IP_REQUIRED) { @@ -792,17 +782,17 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, print_sockaddr(addr, sizeof(addr), &dclist[i]->ss); dc_address = talloc_asprintf(mem_ctx, "\\\\%s", addr); - dc_address_type = ADS_INET_ADDRESS; + dc_address_type = DS_ADDRESS_TYPE_INET; } else { dc_address = talloc_asprintf(mem_ctx, "\\\\%s", r.netbios_hostname); - dc_address_type = ADS_NETBIOS_ADDRESS; + dc_address_type = DS_ADDRESS_TYPE_NETBIOS; } NT_STATUS_HAVE_NO_MEMORY(dc_address); smb_uuid_unpack(r.guid, &dc_guid); if (r.forest) { - dc_flags |= ADS_DNS_FOREST; + dc_flags |= DS_DNS_FOREST; } return make_domain_controller_info(mem_ctx, @@ -827,7 +817,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, uint32_t flags, struct ip_service_name **dclist, int num_dcs, - struct DS_DOMAIN_CONTROLLER_INFO **info) + struct netr_DsRGetDCNameInfo **info) { /* FIXME: code here */ @@ -842,7 +832,7 @@ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, struct GUID *domain_guid, uint32_t flags, const char *site_name, - struct DS_DOMAIN_CONTROLLER_INFO **info) + struct netr_DsRGetDCNameInfo **info) { NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; struct ip_service_name *dclist; @@ -901,10 +891,10 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, struct GUID *domain_guid, const char *site_name, uint32_t flags, - struct DS_DOMAIN_CONTROLLER_INFO **info) + struct netr_DsRGetDCNameInfo **info) { NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; - struct DS_DOMAIN_CONTROLLER_INFO *myinfo = NULL; + struct netr_DsRGetDCNameInfo *myinfo = NULL; DEBUG(10,("dsgetdcname: domain_name: %s, " "domain_guid: %s, site_name: %s, flags: 0x%08x\n", -- cgit From 76a819c9c0e8f0636e455e203bdbe086f34e1b6c Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 28 Mar 2008 13:36:31 +0100 Subject: Use NDR for netr_DsRGetDCNameInfo un-/marshalling in dsgetdcname. Guenther (This used to be commit 7fa53911054a39681df3f08d19aad92f60d59e28) --- source3/libsmb/dsgetdcname.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index bc9f4b92c8..d0a08fddb7 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -298,8 +298,7 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, char *key; bool ret = false; DATA_BLOB blob; - unsigned char *buf = NULL; - int len = 0; + enum ndr_err_code ndr_err; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -312,14 +311,12 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; - len = pack_dsdcinfo(info, &buf); - if (len == -1) { - return NT_STATUS_UNSUCCESSFUL; + ndr_err = ndr_push_struct_blob(&blob, mem_ctx, info, + (ndr_push_flags_fn_t)ndr_push_netr_DsRGetDCNameInfo); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + return ndr_map_error2ntstatus(ndr_err); } - blob = data_blob(buf, len); - SAFE_FREE(buf); - if (gencache_lock_entry(key) != 0) { data_blob_free(&blob); return NT_STATUS_LOCK_NOT_GRANTED; @@ -404,12 +401,13 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, struct GUID *domain_guid, uint32_t flags, const char *site_name, - struct netr_DsRGetDCNameInfo **info, + struct netr_DsRGetDCNameInfo **info_p, bool *expired) { char *key; DATA_BLOB blob; - NTSTATUS status; + enum ndr_err_code ndr_err; + struct netr_DsRGetDCNameInfo *info; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -424,25 +422,37 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } - status = unpack_dsdcinfo(mem_ctx, blob.data, blob.length, info); - if (!NT_STATUS_IS_OK(status)) { - data_blob_free(&blob); - return status; + info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo); + if (!info) { + return NT_STATUS_NO_MEMORY; } + ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, info, + (ndr_pull_flags_fn_t)ndr_pull_netr_DsRGetDCNameInfo); + data_blob_free(&blob); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + dsgetdcname_cache_delete(mem_ctx, domain_name); + return ndr_map_error2ntstatus(ndr_err); + } + + if (DEBUGLEVEL >= 10) { + NDR_PRINT_DEBUG(netr_DsRGetDCNameInfo, info); + } /* check flags */ - if (!check_cldap_reply_required_flags((*info)->dc_flags, flags)) { + if (!check_cldap_reply_required_flags(info->dc_flags, flags)) { DEBUG(10,("invalid flags\n")); return NT_STATUS_INVALID_PARAMETER; } if ((flags & DS_IP_REQUIRED) && - ((*info)->dc_address_type != DS_ADDRESS_TYPE_INET)) { + (info->dc_address_type != DS_ADDRESS_TYPE_INET)) { return NT_STATUS_INVALID_PARAMETER_MIX; } + *info_p = info; + return NT_STATUS_OK; } -- cgit From 7f1a0a5cdf29073326457558cd474b46c670107e Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 28 Mar 2008 13:37:25 +0100 Subject: Remove unneeded pack_dsdcinfo/unpack_dsdcinfo. Guenther (This used to be commit 34dd8f32e1b7fe256ab5dfde5ef5bb8abeec121a) --- source3/libsmb/dsgetdcname.c | 144 ------------------------------------------- 1 file changed, 144 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index d0a08fddb7..7af43648d7 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -107,150 +107,6 @@ void debug_dsdcinfo_flags(int lvl, uint32_t flags) DEBUGADD(lvl,("\n")); } -/********************************************************************* - ********************************************************************/ - -static int pack_dsdcinfo(struct netr_DsRGetDCNameInfo *info, - unsigned char **buf) -{ - unsigned char *buffer = NULL; - int len = 0; - int buflen = 0; - UUID_FLAT guid_flat; - - DEBUG(10,("pack_dsdcinfo: Packing dsdcinfo\n")); - - ZERO_STRUCT(guid_flat); - - if (!GUID_all_zero(&info->domain_guid)) { - smb_uuid_pack(info->domain_guid, &guid_flat); - } - - again: - len = 0; - - if (buflen > 0) { - DEBUG(10,("pack_dsdcinfo: Packing domain %s (%s)\n", - info->domain_name, info->dc_unc)); - } - - len += tdb_pack(buffer+len, buflen-len, "ffdBffdff", - info->dc_unc, - info->dc_address, - info->dc_address_type, - UUID_FLAT_SIZE, guid_flat.info, - info->domain_name, - info->forest_name, - info->dc_flags, - info->dc_site_name, - info->client_site_name); - - if (buflen < len) { - SAFE_FREE(buffer); - if ((buffer = SMB_MALLOC_ARRAY(unsigned char, len)) == NULL ) { - DEBUG(0,("pack_dsdcinfo: failed to alloc buffer!\n")); - buflen = -1; - goto done; - } - buflen = len; - goto again; - } - - *buf = buffer; - - done: - return buflen; -} - -/********************************************************************* - ********************************************************************/ - -static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx, - unsigned char *buf, - int buflen, - struct netr_DsRGetDCNameInfo **info_ret) -{ - int len = 0; - struct netr_DsRGetDCNameInfo *info = NULL; - uint32_t guid_len = 0; - unsigned char *guid_buf = NULL; - UUID_FLAT guid_flat; - - /* forgive me 6 times */ - fstring dc_unc; - fstring dc_address; - fstring domain_name; - fstring forest_name; - fstring dc_site_name; - fstring client_site_name; - - info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo); - NT_STATUS_HAVE_NO_MEMORY(info); - - len += tdb_unpack(buf+len, buflen-len, "ffdBffdff", - &dc_unc, - &dc_address, - &info->dc_address_type, - &guid_len, &guid_buf, - &domain_name, - &forest_name, - &info->dc_flags, - &dc_site_name, - &client_site_name); - if (len == -1) { - DEBUG(5,("unpack_dsdcinfo: Failed to unpack domain\n")); - goto failed; - } - - info->dc_unc = - talloc_strdup(mem_ctx, dc_unc); - info->dc_address = - talloc_strdup(mem_ctx, dc_address); - info->domain_name = - talloc_strdup(mem_ctx, domain_name); - info->forest_name = - talloc_strdup(mem_ctx, forest_name); - info->dc_site_name = - talloc_strdup(mem_ctx, dc_site_name); - info->client_site_name = - talloc_strdup(mem_ctx, client_site_name); - - if (!info->dc_unc || - !info->dc_address || - !info->domain_name || - !info->forest_name || - !info->dc_site_name || - !info->client_site_name) { - goto failed; - } - - if (guid_len > 0) { - struct GUID guid; - - if (guid_len != UUID_FLAT_SIZE) { - goto failed; - } - - memcpy(&guid_flat.info, guid_buf, guid_len); - smb_uuid_unpack(guid_flat, &guid); - - info->domain_guid = guid; - SAFE_FREE(guid_buf); - } - - DEBUG(10,("unpack_dcscinfo: Unpacked domain %s (%s)\n", - info->domain_name, info->dc_unc)); - - *info_ret = info; - - return NT_STATUS_OK; - - failed: - TALLOC_FREE(info); - SAFE_FREE(guid_buf); - return NT_STATUS_NO_MEMORY; -} - /**************************************************************** ****************************************************************/ -- cgit From f466e53b64fffa34b3af33f0380ece5886db5c91 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 16 Apr 2008 23:56:03 +0200 Subject: dsgetdcname: Fix discover_dc_dns. Guenther (This used to be commit 2fe416ffa5c7efd2e6a644e4c8bac756152881d9) --- source3/libsmb/dsgetdcname.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 7af43648d7..00841f0684 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -418,6 +418,8 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, struct dns_rr_srv *dcs = NULL; int numdcs = 0; int numaddrs = 0; + struct ip_service_name *dclist = NULL; + int count = 0; if ((!(flags & DS_DIRECTORY_SERVICE_REQUIRED)) && (!(flags & DS_KDC_REQUIRED)) && @@ -460,9 +462,10 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, numaddrs += MAX(dcs[i].num_ips,1); } - if ((*returned_dclist = TALLOC_ZERO_ARRAY(mem_ctx, - struct ip_service_name, - numaddrs)) == NULL) { + dclist = TALLOC_ZERO_ARRAY(mem_ctx, + struct ip_service_name, + numaddrs); + if (!dclist) { return NT_STATUS_NO_MEMORY; } @@ -471,15 +474,16 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, *return_count = 0; i = 0; j = 0; - while (i < numdcs && (*return_countport = dcs[i].port; r->hostname = dcs[i].hostname; if (!(flags & DS_IP_REQUIRED)) { - (*return_count)++; + count++; continue; } @@ -511,13 +515,19 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, * anything about the DC's -- jerry */ if (!is_zero_addr(&r->ss)) { - (*return_count)++; + count++; continue; } } - return (*return_count > 0) ? NT_STATUS_OK : - NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + *returned_dclist = dclist; + *return_count = count; + + if (count > 0) { + return NT_STATUS_OK; + } + + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; } /**************************************************************** @@ -590,7 +600,7 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, const char *domain_name, uint32_t flags, - struct ip_service_name **dclist, + struct ip_service_name *dclist, int num_dcs, struct netr_DsRGetDCNameInfo **info) { @@ -607,7 +617,9 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, ZERO_STRUCT(r); - if ((ads_cldap_netlogon(dclist[i]->hostname, + DEBUG(10,("LDAP ping to %s\n", dclist[i].hostname)); + + if ((ads_cldap_netlogon(dclist[i].hostname, domain_name, &r)) && (check_cldap_reply_required_flags(r.flags, flags))) { valid_dc = true; @@ -645,7 +657,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, if (flags & DS_IP_REQUIRED) { char addr[INET6_ADDRSTRLEN]; - print_sockaddr(addr, sizeof(addr), &dclist[i]->ss); + print_sockaddr(addr, sizeof(addr), &dclist[i].ss); dc_address = talloc_asprintf(mem_ctx, "\\\\%s", addr); dc_address_type = DS_ADDRESS_TYPE_INET; @@ -723,7 +735,7 @@ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, NT_STATUS_NOT_OK_RETURN(status); return process_dc_dns(mem_ctx, domain_name, flags, - &dclist, num_dcs, info); + dclist, num_dcs, info); } status = discover_dc_dns(mem_ctx, domain_name, domain_guid, flags, @@ -731,7 +743,7 @@ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, if (NT_STATUS_IS_OK(status) && num_dcs != 0) { - status = process_dc_dns(mem_ctx, domain_name, flags, &dclist, + status = process_dc_dns(mem_ctx, domain_name, flags, dclist, num_dcs, info); if (NT_STATUS_IS_OK(status)) { return status; -- cgit From ba98dd4989db16028a2690d382ab178524ce765b Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 21 Apr 2008 19:26:32 +0200 Subject: libads: Use libnbt for CLDAP reply parsing. Guenther (This used to be commit 751f3064a508341c0ebae45e8de9f5311d915d70) --- source3/libsmb/dsgetdcname.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 00841f0684..531ab11622 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -196,7 +196,7 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, const char *site_name, struct netr_DsRGetDCNameInfo *info) { - struct cldap_netlogon_reply r; + struct nbt_cldap_netlogon_5 r; /* check if matching entry is older then 15 minutes, if yes, send * CLDAP/MAILSLOT ping again and store the cached data */ @@ -606,12 +606,11 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, { int i = 0; bool valid_dc = false; - struct cldap_netlogon_reply r; + struct nbt_cldap_netlogon_5 r; const char *dc_hostname, *dc_domain_name; const char *dc_address; uint32_t dc_address_type; uint32_t dc_flags; - struct GUID dc_guid; for (i=0; i Date: Mon, 21 Apr 2008 19:47:13 +0200 Subject: cldap: add talloc context to ads_cldap_netlogon(). Guenther (This used to be commit 4cee7b1bd5cd97c414b73d6f39238958480cdcf3) --- source3/libsmb/dsgetdcname.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 531ab11622..0b3b3d9bbf 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -203,7 +203,7 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, ZERO_STRUCT(r); - if (ads_cldap_netlogon(info->dc_unc, + if (ads_cldap_netlogon(mem_ctx, info->dc_unc, info->domain_name, &r)) { dsgetdcname_cache_delete(mem_ctx, domain_name); @@ -618,7 +618,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, DEBUG(10,("LDAP ping to %s\n", dclist[i].hostname)); - if ((ads_cldap_netlogon(dclist[i].hostname, + if ((ads_cldap_netlogon(mem_ctx, dclist[i].hostname, domain_name, &r)) && (check_cldap_reply_required_flags(r.server_type, flags))) { valid_dc = true; -- cgit From bcbac69d1a38e128ffe8b763ac027d6eab33dcec Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 21 Apr 2008 19:59:27 +0200 Subject: cldap: avoid duplicate definitions so remove ads_cldap.h. Guenther (This used to be commit 538eefe22ad69540b9f73ffaa613d6be045de199) --- source3/libsmb/dsgetdcname.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 0b3b3d9bbf..7834632806 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -225,26 +225,26 @@ static bool check_cldap_reply_required_flags(uint32_t ret_flags, uint32_t req_flags) { if (req_flags & DS_PDC_REQUIRED) - RETURN_ON_FALSE(ret_flags & ADS_PDC); + RETURN_ON_FALSE(ret_flags & NBT_SERVER_PDC); if (req_flags & DS_GC_SERVER_REQUIRED) - RETURN_ON_FALSE(ret_flags & ADS_GC); + RETURN_ON_FALSE(ret_flags & NBT_SERVER_GC); if (req_flags & DS_ONLY_LDAP_NEEDED) - RETURN_ON_FALSE(ret_flags & ADS_LDAP); + RETURN_ON_FALSE(ret_flags & NBT_SERVER_LDAP); if ((req_flags & DS_DIRECTORY_SERVICE_REQUIRED) || (req_flags & DS_DIRECTORY_SERVICE_PREFERRED)) - RETURN_ON_FALSE(ret_flags & ADS_DS); + RETURN_ON_FALSE(ret_flags & NBT_SERVER_DS); if (req_flags & DS_KDC_REQUIRED) - RETURN_ON_FALSE(ret_flags & ADS_KDC); + RETURN_ON_FALSE(ret_flags & NBT_SERVER_KDC); if (req_flags & DS_TIMESERV_REQUIRED) - RETURN_ON_FALSE(ret_flags & ADS_TIMESERV); + RETURN_ON_FALSE(ret_flags & NBT_SERVER_TIMESERV); if (req_flags & DS_WRITABLE_REQUIRED) - RETURN_ON_FALSE(ret_flags & ADS_WRITABLE); + RETURN_ON_FALSE(ret_flags & NBT_SERVER_WRITABLE); return true; } -- cgit From bd3991ac970c1b0856e2e8525fe683c0b1596ea1 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 22 Apr 2008 00:04:25 +0200 Subject: dsgetdcname: add very basic flat name support. Guenther (This used to be commit bb72d0b71e2a85d50e7bd893670c3eec69717580) --- source3/libsmb/dsgetdcname.c | 177 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 168 insertions(+), 9 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 7834632806..874a7749b7 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -391,15 +391,60 @@ static NTSTATUS discover_dc_netbios(TALLOC_CTX *mem_ctx, const char *domain_name, uint32_t flags, struct ip_service_name **returned_dclist, - int *return_count) + int *returned_count) { + NTSTATUS status; + enum nbt_name_type name_type = NBT_NAME_LOGON; + struct ip_service *iplist; + int i; + struct ip_service_name *dclist = NULL; + int count; + + *returned_dclist = NULL; + *returned_count = 0; + if (lp_disable_netbios()) { return NT_STATUS_NOT_SUPPORTED; } - /* FIXME: code here */ + if (flags & DS_PDC_REQUIRED) { + name_type = NBT_NAME_PDC; + } - return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + status = internal_resolve_name(domain_name, name_type, NULL, + &iplist, &count, + "lmhosts wins bcast"); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(10,("discover_dc_netbios: failed to find DC\n")); + return status; + } + + dclist = TALLOC_ZERO_ARRAY(mem_ctx, struct ip_service_name, count); + if (!dclist) { + return NT_STATUS_NO_MEMORY; + } + + for (i=0; iss = iplist[i].ss; + r->port = iplist[i].port; + r->hostname = talloc_strdup(mem_ctx, addr); + if (!r->hostname) { + return NT_STATUS_NO_MEMORY; + } + + } + + *returned_dclist = dclist; + *returned_count = count; + + return NT_STATUS_OK; } /**************************************************************** @@ -688,16 +733,130 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ +static struct event_context *ev_context(void) +{ + static struct event_context *ctx; + + if (!ctx && !(ctx = event_context_init(NULL))) { + smb_panic("Could not init event context"); + } + return ctx; +} + +/**************************************************************** +****************************************************************/ + +static struct messaging_context *msg_context(TALLOC_CTX *mem_ctx) +{ + static struct messaging_context *ctx; + + if (!ctx && !(ctx = messaging_init(mem_ctx, server_id_self(), + ev_context()))) { + smb_panic("Could not init messaging context"); + } + return ctx; +} + +/**************************************************************** +****************************************************************/ + static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, const char *domain_name, uint32_t flags, - struct ip_service_name **dclist, + struct ip_service_name *dclist, int num_dcs, struct netr_DsRGetDCNameInfo **info) { - /* FIXME: code here */ + struct sockaddr_storage ss; + struct ip_service ip_list; + enum nbt_name_type name_type = NBT_NAME_LOGON; + + int i; + const char *dc_hostname, *dc_domain_name; + const char *dc_address; + uint32_t dc_address_type; + uint32_t dc_flags = 0; + const char *dc_name = NULL; + fstring tmp_dc_name; + struct messaging_context *msg_ctx = msg_context(mem_ctx); + + if (flags & DS_PDC_REQUIRED) { + name_type = NBT_NAME_PDC; + } + + DEBUG(10,("process_dc_netbios\n")); + + for (i=0; i Date: Tue, 22 Apr 2008 00:05:05 +0200 Subject: dsgetdcname: Fix discover_dc_dns(). Guenther (This used to be commit ec86deb349850c634b49cd5a536e9281a4a6e7d8) --- source3/libsmb/dsgetdcname.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 874a7749b7..5af65c5dca 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -524,8 +524,8 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, struct ip_service_name *r = &dclist[count]; - r->port = dcs[i].port; - r->hostname = dcs[i].hostname; + r->port = dcs[count].port; + r->hostname = dcs[count].hostname; if (!(flags & DS_IP_REQUIRED)) { count++; -- cgit From e66d452466514a16c15acf64cbb9494b46ea92c1 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 24 Apr 2008 21:28:03 +0200 Subject: mailslot: allow to define nt_version in send_getdc_request(). Guenther (This used to be commit ce3728191b23badfd5eb92701e4cebf84273b61e) --- source3/libsmb/dsgetdcname.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 5af65c5dca..f357e92b9b 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -796,7 +796,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, } if (send_getdc_request(mem_ctx, msg_ctx, - &dclist[i].ss, domain_name, NULL)) + &dclist[i].ss, domain_name, + NULL, 1)) { int k; smb_msleep(100); -- cgit From b77601a4b7c9d0f472eb51dad1d491d54a6dcbdc Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 24 Apr 2008 21:37:42 +0200 Subject: mailslot: allow to give back struct nbt_ntlogon_packet. Guenther (This used to be commit 2b178dcae608ecc05f62593a7a0c2a127b8b7ca2) --- source3/libsmb/dsgetdcname.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index f357e92b9b..af1dc04059 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -779,6 +779,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, const char *dc_name = NULL; fstring tmp_dc_name; struct messaging_context *msg_ctx = msg_context(mem_ctx); + struct nbt_ntlogon_packet *reply = NULL; if (flags & DS_PDC_REQUIRED) { name_type = NBT_NAME_PDC; @@ -805,7 +806,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, if (receive_getdc_response(mem_ctx, &dclist[i].ss, domain_name, - &dc_name)) { + &dc_name, + &reply)) { namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list); dc_hostname = dc_name; dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name); -- cgit From 051ff45c6041accdf4f74d33db16158a3aa95a4c Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 24 Apr 2008 21:53:55 +0200 Subject: mailslot/dsgetdcname: do what XP does and request nt_version 11. This allows dsgetdcname to query for a flat, non-dns domain name and come back with all information about the DC (site names, guid, forest, etc.) based on a mailslot reply. The version 11 request is downgraded to version 1 in case we do a query against NT4. Guenther (This used to be commit d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3) --- source3/libsmb/dsgetdcname.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index af1dc04059..fbc3bda6e4 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -777,6 +777,10 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, uint32_t dc_address_type; uint32_t dc_flags = 0; const char *dc_name = NULL; + const char *dc_forest = NULL; + const char *dc_server_site = NULL; + const char *dc_client_site = NULL; + struct GUID *dc_domain_guid = NULL; fstring tmp_dc_name; struct messaging_context *msg_ctx = msg_context(mem_ctx); struct nbt_ntlogon_packet *reply = NULL; @@ -798,7 +802,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, if (send_getdc_request(mem_ctx, msg_ctx, &dclist[i].ss, domain_name, - NULL, 1)) + NULL, 11)) { int k; smb_msleep(100); @@ -835,6 +839,25 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, make_reply: + if (reply && reply->command == NTLOGON_RESPONSE_FROM_PDC2) { + + dc_flags |= reply->req.reply2.server_type; + dc_forest = reply->req.reply2.forest; + dc_server_site = reply->req.reply2.server_site; + dc_client_site = reply->req.reply2.client_site; + + dc_domain_guid = &reply->req.reply2.domain_uuid; + + if (flags & DS_RETURN_DNS_NAME) { + dc_domain_name = reply->req.reply2.dns_domain; + dc_hostname = reply->req.reply2.pdc_dns_name; + dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; + } else if (flags & DS_RETURN_FLAT_NAME) { + dc_domain_name = reply->req.reply2.domain; + dc_hostname = reply->req.reply2.pdc_name; + } + } + if (flags & DS_IP_REQUIRED) { char addr[INET6_ADDRSTRLEN]; print_sockaddr(addr, sizeof(addr), &dclist[i].ss); @@ -849,16 +872,20 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, dc_flags |= NBT_SERVER_PDC | NBT_SERVER_WRITABLE; } + if (dc_forest) { + dc_flags |= DS_DNS_FOREST; + } + return make_domain_controller_info(mem_ctx, dc_hostname, dc_address, dc_address_type, - NULL, + dc_domain_guid, dc_domain_name, - NULL, + dc_forest, dc_flags, - NULL, - NULL, + dc_server_site, + dc_client_site, info); } -- cgit From 5c02872a10c3f650c31ec7ce78fa6732d6646961 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 5 May 2008 17:22:49 +0200 Subject: dsgetdcname: use correct dc name for name cache store. Guenther (This used to be commit ce1556d0fb993b78f02ac4cc4f8a45ab7a0b5397) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index fbc3bda6e4..de647ad8bf 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -830,7 +830,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, { dc_hostname = tmp_dc_name; dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name); - namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list); + namecache_store(tmp_dc_name, NBT_NAME_SERVER, 1, &ip_list); goto make_reply; } } -- cgit From 1f6065765c148251488acd068fdea98717f7233f Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 5 May 2008 18:04:41 +0200 Subject: mailslot/cldap: use nt_version bits in queries. Guenther (This used to be commit b261f063125f8454d8f4e8f6b6f8aa5bc393ea34) --- source3/libsmb/dsgetdcname.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index de647ad8bf..1bd54d80e6 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -784,6 +784,9 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, fstring tmp_dc_name; struct messaging_context *msg_ctx = msg_context(mem_ctx); struct nbt_ntlogon_packet *reply = NULL; + uint32_t nt_version = NETLOGON_VERSION_1 | + NETLOGON_VERSION_5 | + NETLOGON_VERSION_5EX_WITH_IP; if (flags & DS_PDC_REQUIRED) { name_type = NBT_NAME_PDC; @@ -802,7 +805,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, if (send_getdc_request(mem_ctx, msg_ctx, &dclist[i].ss, domain_name, - NULL, 11)) + NULL, nt_version)) { int k; smb_msleep(100); -- cgit From 7b5ec90b727b4653ca7ccd05cb0f51ff5c670971 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 14:09:41 +0200 Subject: dsgetdcname: remove invalid assumptions when using DNS for the DC query. Guenther (This used to be commit a81818ae54159755df441cc6421e5b272035f412) --- source3/libsmb/dsgetdcname.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 1bd54d80e6..1006b975c7 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -466,14 +466,6 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, struct ip_service_name *dclist = NULL; int count = 0; - if ((!(flags & DS_DIRECTORY_SERVICE_REQUIRED)) && - (!(flags & DS_KDC_REQUIRED)) && - (!(flags & DS_GC_SERVER_REQUIRED)) && - (!(flags & DS_PDC_REQUIRED))) { - DEBUG(1,("discover_dc_dns: invalid flags\n")); - return NT_STATUS_INVALID_PARAMETER; - } - if (flags & DS_PDC_REQUIRED) { status = ads_dns_query_pdc(mem_ctx, domain_name, &dcs, &numdcs); @@ -490,9 +482,8 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, status = ads_dns_query_dcs_guid(mem_ctx, domain_name, domain_guid, &dcs, &numdcs); } else { - /* FIXME: ? */ - DEBUG(1,("discover_dc_dns: not enough input\n")); - status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + status = ads_dns_query_dcs(mem_ctx, domain_name, site_name, + &dcs, &numdcs); } if (!NT_STATUS_IS_OK(status)) { -- cgit From fcdee399884ae73eaf10663fb718f148bb4aff24 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 14:38:35 +0200 Subject: dsgetdcname: add map_ds_flags_to_nt_version. Guenther (This used to be commit 1809ea22c31ee28e109f49701f91534177027165) --- source3/libsmb/dsgetdcname.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 1006b975c7..c7eb8005bc 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -633,6 +633,32 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ +static uint32_t map_ds_flags_to_nt_version(uint32_t flags) +{ + uint32_t nt_version = 0; + + if (flags & DS_PDC_REQUIRED) { + nt_version |= NETLOGON_VERSION_PDC; + } + + if (flags & DS_GC_SERVER_REQUIRED) { + nt_version |= NETLOGON_VERSION_GC; + } + + if (flags & DS_TRY_NEXTCLOSEST_SITE) { + nt_version |= NETLOGON_VERSION_WITH_CLOSEST_SITE; + } + + if (flags & DS_IP_REQUIRED) { + nt_version |= NETLOGON_VERSION_IP; + } + + return nt_version; +} + +/**************************************************************** +****************************************************************/ + static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, const char *domain_name, uint32_t flags, @@ -783,6 +809,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, name_type = NBT_NAME_PDC; } + nt_version |= map_ds_flags_to_nt_version(flags); + DEBUG(10,("process_dc_netbios\n")); for (i=0; i Date: Wed, 7 May 2008 15:21:41 +0200 Subject: dsgetdcname: add pull_mailslot_cldap_reply(). Guenther (This used to be commit 95fb01d8702342265f8837a368dc42f4a4d394d5) --- source3/libsmb/dsgetdcname.c | 84 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index c7eb8005bc..98c9997575 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -1023,3 +1023,87 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, return status; } + +/**************************************************************** +****************************************************************/ + +bool pull_mailslot_cldap_reply(TALLOC_CTX *mem_ctx, + const DATA_BLOB *blob, + union nbt_cldap_netlogon *r, + uint32_t *nt_version) +{ + enum ndr_err_code ndr_err; + uint32_t nt_version_query = ((*nt_version) & 0x000000ff); + uint16_t command = 0; + + ndr_err = ndr_pull_struct_blob(blob, mem_ctx, &command, + (ndr_pull_flags_fn_t)ndr_pull_uint16); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + return false; + } + + switch (command) { + case 0x13: /* 19 */ + case 0x15: /* 21 */ + case 0x17: /* 23 */ + break; + default: + DEBUG(1,("got unexpected command: %d (0x%08x)\n", + command, command)); + return false; + } + + ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, + (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); + if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto done; + } + + /* when the caller requested just those nt_version bits that the server + * was able to reply to, we are fine and all done. otherwise we need to + * assume downgraded replies which are painfully parsed here - gd */ + + if (nt_version_query & NETLOGON_VERSION_WITH_CLOSEST_SITE) { + nt_version_query &= ~NETLOGON_VERSION_WITH_CLOSEST_SITE; + } + ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, + (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); + if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto done; + } + if (nt_version_query & NETLOGON_VERSION_5EX_WITH_IP) { + nt_version_query &= ~NETLOGON_VERSION_5EX_WITH_IP; + } + ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, + (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); + if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto done; + } + if (nt_version_query & NETLOGON_VERSION_5EX) { + nt_version_query &= ~NETLOGON_VERSION_5EX; + } + ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, + (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); + if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto done; + } + if (nt_version_query & NETLOGON_VERSION_5) { + nt_version_query &= ~NETLOGON_VERSION_5; + } + ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, + (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); + if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto done; + } + + return false; + + done: + if (DEBUGLEVEL >= 10) { + NDR_PRINT_UNION_DEBUG(nbt_cldap_netlogon, nt_version_query, r); + } + + *nt_version = nt_version_query; + + return true; +} -- cgit From cdd9913c4a7d254ab3ef677737493f9f540272c7 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 15:49:09 +0200 Subject: cldap: let ads_cldap_netlogon() return all possible cldap replies. Guenther (This used to be commit 6f9d5e1cc94bc90685b54c04622b8f3357bd2f69) --- source3/libsmb/dsgetdcname.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 98c9997575..1fd42120ee 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -196,15 +196,13 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, const char *site_name, struct netr_DsRGetDCNameInfo *info) { - struct nbt_cldap_netlogon_5 r; + uint32_t nt_version = NETLOGON_VERSION_1; /* check if matching entry is older then 15 minutes, if yes, send * CLDAP/MAILSLOT ping again and store the cached data */ - ZERO_STRUCT(r); - if (ads_cldap_netlogon(mem_ctx, info->dc_unc, - info->domain_name, &r)) { + info->domain_name, &nt_version, NULL)) { dsgetdcname_cache_delete(mem_ctx, domain_name); -- cgit From 9b4ea32c2d42f5d7f3e52fad3f81d932e654d4d0 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 16:49:39 +0200 Subject: dsgetdcname: add get_cldap_reply_server_flags(). Guenther (This used to be commit 3c05c56d4c0aac8106684cda3152c65299c63075) --- source3/libsmb/dsgetdcname.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 1fd42120ee..5d6e2daba4 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -217,6 +217,38 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ +static uint32_t get_cldap_reply_server_flags(union nbt_cldap_netlogon *r, + uint32_t nt_version) +{ + switch (nt_version & 0x000000ff) { + case 0: + case 1: + return 0; + case 2: + case 3: + return r->logon3.server_type; + case 4: + case 5: + case 6: + case 7: + return r->logon5.server_type; + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + return r->logon13.server_type; + default: + return r->logon29.server_type; + } +} + +/**************************************************************** +****************************************************************/ + #define RETURN_ON_FALSE(x) if (!x) return false; static bool check_cldap_reply_required_flags(uint32_t ret_flags, -- cgit From 81aa670343d77de0782f2275f7bba9d396d24bec Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 18:36:03 +0200 Subject: dsgetdcname: add make_dc_info_from_cldap_reply(). Guenther (This used to be commit 9db2e50a20caabaf90ce03203a066ddd7820d33a) --- source3/libsmb/dsgetdcname.c | 146 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 5d6e2daba4..72a0bb5984 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -640,6 +640,7 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, if (forest_name) { info->forest_name = talloc_strdup(mem_ctx, forest_name); NT_STATUS_HAVE_NO_MEMORY(info->forest_name); + flags |= DS_DNS_FOREST; } info->dc_flags = flags; @@ -663,6 +664,151 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ +static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, + uint32_t flags, + struct sockaddr_storage *ss, + uint32_t nt_version, + union nbt_cldap_netlogon *r, + struct netr_DsRGetDCNameInfo **info) +{ + const char *dc_hostname, *dc_domain_name; + const char *dc_address = NULL; + const char *dc_forest = NULL; + uint32_t dc_address_type = 0; + uint32_t dc_flags = 0; + struct GUID *dc_domain_guid = NULL; + const char *dc_server_site = NULL; + const char *dc_client_site = NULL; + + char addr[INET6_ADDRSTRLEN]; + + print_sockaddr(addr, sizeof(addr), ss); + + dc_address = talloc_asprintf(mem_ctx, "\\\\%s", addr); + NT_STATUS_HAVE_NO_MEMORY(dc_address); + dc_address_type = DS_ADDRESS_TYPE_INET; + + switch (nt_version & 0x000000ff) { + case 0: + return NT_STATUS_INVALID_PARAMETER; + case 1: + dc_hostname = r->logon1.pdc_name; + dc_domain_name = r->logon1.domain_name; + if (flags & DS_PDC_REQUIRED) { + dc_flags = NBT_SERVER_WRITABLE | NBT_SERVER_PDC; + } + break; + case 2: + case 3: + switch (flags & 0xf0000000) { + case DS_RETURN_FLAT_NAME: + dc_hostname = r->logon3.pdc_name; + dc_domain_name = r->logon3.domain_name; + break; + case DS_RETURN_DNS_NAME: + default: + dc_hostname = r->logon3.pdc_dns_name; + dc_domain_name = r->logon3.dns_domain; + dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; + break; + } + + dc_flags |= r->logon3.server_type; + dc_forest = r->logon3.forest; + dc_domain_guid = &r->logon3.domain_uuid; + + break; + case 4: + case 5: + case 6: + case 7: + switch (flags & 0xf0000000) { + case DS_RETURN_FLAT_NAME: + dc_hostname = r->logon5.pdc_name; + dc_domain_name = r->logon5.domain; + break; + case DS_RETURN_DNS_NAME: + default: + dc_hostname = r->logon5.pdc_dns_name; + dc_domain_name = r->logon5.dns_domain; + dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; + break; + } + + dc_flags |= r->logon5.server_type; + dc_forest = r->logon5.forest; + dc_domain_guid = &r->logon5.domain_uuid; + dc_server_site = r->logon5.server_site; + dc_client_site = r->logon5.client_site; + + break; + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + switch (flags & 0xf0000000) { + case DS_RETURN_FLAT_NAME: + dc_hostname = r->logon13.pdc_name; + dc_domain_name = r->logon13.domain; + break; + case DS_RETURN_DNS_NAME: + default: + dc_hostname = r->logon13.pdc_dns_name; + dc_domain_name = r->logon13.dns_domain; + dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; + break; + } + + dc_flags |= r->logon13.server_type; + dc_forest = r->logon13.forest; + dc_domain_guid = &r->logon13.domain_uuid; + dc_server_site = r->logon13.server_site; + dc_client_site = r->logon13.client_site; + + break; + default: + switch (flags & 0xf0000000) { + case DS_RETURN_FLAT_NAME: + dc_hostname = r->logon29.pdc_name; + dc_domain_name = r->logon29.domain; + break; + case DS_RETURN_DNS_NAME: + default: + dc_hostname = r->logon29.pdc_dns_name; + dc_domain_name = r->logon29.dns_domain; + dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; + break; + } + + dc_flags |= r->logon29.server_type; + dc_forest = r->logon29.forest; + dc_domain_guid = &r->logon29.domain_uuid; + dc_server_site = r->logon29.server_site; + dc_client_site = r->logon29.client_site; + + break; + } + + return make_domain_controller_info(mem_ctx, + dc_hostname, + dc_address, + dc_address_type, + dc_domain_guid, + dc_domain_name, + dc_forest, + dc_flags, + dc_server_site, + dc_client_site, + info); +} + +/**************************************************************** +****************************************************************/ + static uint32_t map_ds_flags_to_nt_version(uint32_t flags) { uint32_t nt_version = 0; -- cgit From 0354d00ddfae53f278bd2b3480f3eaeefe84e518 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 18:38:37 +0200 Subject: dsgetdcname: use make_dc_info_from_cldap_reply() for cldap replies. Guenther (This used to be commit a3e5b073f0474543ca74b40775ce1d7f80719c96) --- source3/libsmb/dsgetdcname.c | 84 +++++++++++--------------------------------- 1 file changed, 21 insertions(+), 63 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 72a0bb5984..6ea60ab854 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -254,6 +254,10 @@ static uint32_t get_cldap_reply_server_flags(union nbt_cldap_netlogon *r, static bool check_cldap_reply_required_flags(uint32_t ret_flags, uint32_t req_flags) { + if (ret_flags == 0) { + return true; + } + if (req_flags & DS_PDC_REQUIRED) RETURN_ON_FALSE(ret_flags & NBT_SERVER_PDC); @@ -844,23 +848,26 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, { int i = 0; bool valid_dc = false; - struct nbt_cldap_netlogon_5 r; - const char *dc_hostname, *dc_domain_name; - const char *dc_address; - uint32_t dc_address_type; - uint32_t dc_flags; + union nbt_cldap_netlogon *r = NULL; + uint32_t nt_version = NETLOGON_VERSION_5 | + NETLOGON_VERSION_5EX; + uint32_t ret_flags = 0; for (i=0; i Date: Wed, 7 May 2008 18:39:24 +0200 Subject: dsgetdcname: map additional flags to nt_version. Guenther (This used to be commit 1009123b8600e6ccebe180f4a2f87c217638fef8) --- source3/libsmb/dsgetdcname.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 6ea60ab854..a278c4ef50 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -853,6 +853,8 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, NETLOGON_VERSION_5EX; uint32_t ret_flags = 0; + nt_version |= map_ds_flags_to_nt_version(flags); + for (i=0; i Date: Wed, 7 May 2008 18:55:45 +0200 Subject: dsgetdcname: wait a little longer for mailslot replies. Guenther (This used to be commit bc0d7a90dcc7bf702b24feb16abf4634ff178671) --- source3/libsmb/dsgetdcname.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index a278c4ef50..b64f340456 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -963,7 +963,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, NULL, nt_version)) { int k; - smb_msleep(100); + smb_msleep(300); for (k=0; k<5; k++) { if (receive_getdc_response(mem_ctx, &dclist[i].ss, @@ -976,7 +976,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, NT_STATUS_HAVE_NO_MEMORY(dc_domain_name); goto make_reply; } - smb_msleep(500); + smb_msleep(1500); } } -- cgit From 9be17e2187a93633b23761fc2f6f0b40c94db809 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 18:57:43 +0200 Subject: dsgetdcname: mailslot replies are identical to the cldap ones, use cldap everywhere. Guenther (This used to be commit fe904ee77a7fec1674e9db660978c40c17897f77) --- source3/libsmb/dsgetdcname.c | 79 +++++++++++--------------------------------- 1 file changed, 19 insertions(+), 60 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index b64f340456..a21fc9a217 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -925,18 +925,10 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, enum nbt_name_type name_type = NBT_NAME_LOGON; int i; - const char *dc_hostname, *dc_domain_name; - const char *dc_address; - uint32_t dc_address_type; - uint32_t dc_flags = 0; const char *dc_name = NULL; - const char *dc_forest = NULL; - const char *dc_server_site = NULL; - const char *dc_client_site = NULL; - struct GUID *dc_domain_guid = NULL; fstring tmp_dc_name; struct messaging_context *msg_ctx = msg_context(mem_ctx); - struct nbt_ntlogon_packet *reply = NULL; + union nbt_cldap_netlogon *reply = NULL; uint32_t nt_version = NETLOGON_VERSION_1 | NETLOGON_VERSION_5 | NETLOGON_VERSION_5EX_WITH_IP; @@ -968,12 +960,10 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, if (receive_getdc_response(mem_ctx, &dclist[i].ss, domain_name, + &nt_version, &dc_name, &reply)) { namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list); - dc_hostname = dc_name; - dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name); - NT_STATUS_HAVE_NO_MEMORY(dc_domain_name); goto make_reply; } smb_msleep(1500); @@ -986,65 +976,34 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, &dclist[i].ss, tmp_dc_name)) { - dc_hostname = tmp_dc_name; - dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name); - namecache_store(tmp_dc_name, NBT_NAME_SERVER, 1, &ip_list); - goto make_reply; - } - } + struct nbt_cldap_netlogon_1 logon1; - return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; + reply = TALLOC_ZERO_P(mem_ctx, union nbt_cldap_netlogon); + NT_STATUS_HAVE_NO_MEMORY(reply); - make_reply: + ZERO_STRUCT(logon1); - if (reply && reply->command == NTLOGON_RESPONSE_FROM_PDC2) { + nt_version = NETLOGON_VERSION_1; - dc_flags |= reply->req.reply2.server_type; - dc_forest = reply->req.reply2.forest; - dc_server_site = reply->req.reply2.server_site; - dc_client_site = reply->req.reply2.client_site; + logon1.nt_version = nt_version; + logon1.pdc_name = tmp_dc_name; + logon1.domain_name = talloc_strdup_upper(mem_ctx, domain_name); + NT_STATUS_HAVE_NO_MEMORY(logon1.domain_name); - dc_domain_guid = &reply->req.reply2.domain_uuid; + reply->logon1 = logon1; - if (flags & DS_RETURN_DNS_NAME) { - dc_domain_name = reply->req.reply2.dns_domain; - dc_hostname = reply->req.reply2.pdc_dns_name; - dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; - } else if (flags & DS_RETURN_FLAT_NAME) { - dc_domain_name = reply->req.reply2.domain; - dc_hostname = reply->req.reply2.pdc_name; - } - } + namecache_store(tmp_dc_name, NBT_NAME_SERVER, 1, &ip_list); - if (flags & DS_IP_REQUIRED) { - char addr[INET6_ADDRSTRLEN]; - print_sockaddr(addr, sizeof(addr), &dclist[i].ss); - dc_address = talloc_asprintf(mem_ctx, "\\\\%s", addr); - dc_address_type = DS_ADDRESS_TYPE_INET; - } else { - dc_address = talloc_asprintf(mem_ctx, "\\\\%s", dc_hostname); - dc_address_type = DS_ADDRESS_TYPE_NETBIOS; + goto make_reply; + } } - if (flags & DS_PDC_REQUIRED) { - dc_flags |= NBT_SERVER_PDC | NBT_SERVER_WRITABLE; - } + return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; - if (dc_forest) { - dc_flags |= DS_DNS_FOREST; - } + make_reply: - return make_domain_controller_info(mem_ctx, - dc_hostname, - dc_address, - dc_address_type, - dc_domain_guid, - dc_domain_name, - dc_forest, - dc_flags, - dc_server_site, - dc_client_site, - info); + return make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, + nt_version, reply, info); } /**************************************************************** -- cgit From eaef936523b9fbd62e53b7b8f8ee6576da525eb4 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 21:02:50 +0200 Subject: dsgetdcname: remove invalid assumption in discover_dc_dns(). Guenther (This used to be commit f48b2e844b673e99c84cb24f3c3718352ab93ce5) --- source3/libsmb/dsgetdcname.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index a21fc9a217..981994ca43 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -552,11 +552,6 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx, r->port = dcs[count].port; r->hostname = dcs[count].hostname; - if (!(flags & DS_IP_REQUIRED)) { - count++; - continue; - } - /* If we don't have an IP list for a name, lookup it up */ if (!dcs[i].ss_s) { -- cgit From 8441681819dcbc54143ac0f590c2795750daa96c Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 21:04:10 +0200 Subject: dsgetdcname: be more paranoid about the existance of an ip_address. Guenther (This used to be commit d13fe66f3d9ba152e3e8197ee6682e175163a6cd) --- source3/libsmb/dsgetdcname.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 981994ca43..388c7be395 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -621,7 +621,12 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, } if (dc_address) { - info->dc_address = talloc_strdup(mem_ctx, dc_address); + if (!(dc_address[0] == '\\' && dc_address[1] == '\\')) { + info->dc_address = talloc_asprintf(mem_ctx, "\\\\%s", + dc_address); + } else { + info->dc_address = talloc_strdup(mem_ctx, dc_address); + } NT_STATUS_HAVE_NO_MEMORY(info->dc_address); } @@ -681,16 +686,21 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, char addr[INET6_ADDRSTRLEN]; - print_sockaddr(addr, sizeof(addr), ss); - - dc_address = talloc_asprintf(mem_ctx, "\\\\%s", addr); - NT_STATUS_HAVE_NO_MEMORY(dc_address); - dc_address_type = DS_ADDRESS_TYPE_INET; + if (ss) { + print_sockaddr(addr, sizeof(addr), ss); + dc_address = addr; + dc_address_type = DS_ADDRESS_TYPE_INET; + } switch (nt_version & 0x000000ff) { case 0: return NT_STATUS_INVALID_PARAMETER; case 1: + if (!ss) { + dc_address = r->logon1.pdc_name; + dc_address_type = DS_ADDRESS_TYPE_NETBIOS; + } + dc_hostname = r->logon1.pdc_name; dc_domain_name = r->logon1.domain_name; if (flags & DS_PDC_REQUIRED) { @@ -699,6 +709,11 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, break; case 2: case 3: + if (!ss) { + dc_address = r->logon3.pdc_ip; + dc_address_type = DS_ADDRESS_TYPE_INET; + } + switch (flags & 0xf0000000) { case DS_RETURN_FLAT_NAME: dc_hostname = r->logon3.pdc_name; @@ -721,6 +736,11 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, case 5: case 6: case 7: + if (!ss) { + dc_address = r->logon5.pdc_name; + dc_address_type = DS_ADDRESS_TYPE_NETBIOS; + } + switch (flags & 0xf0000000) { case DS_RETURN_FLAT_NAME: dc_hostname = r->logon5.pdc_name; @@ -749,6 +769,11 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, case 13: case 14: case 15: + if (!ss) { + dc_address = r->logon13.dc_sock_addr.pdc_ip; + dc_address_type = DS_ADDRESS_TYPE_INET; + } + switch (flags & 0xf0000000) { case DS_RETURN_FLAT_NAME: dc_hostname = r->logon13.pdc_name; @@ -770,6 +795,11 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, break; default: + if (!ss) { + dc_address = r->logon29.dc_sock_addr.pdc_ip; + dc_address_type = DS_ADDRESS_TYPE_INET; + } + switch (flags & 0xf0000000) { case DS_RETURN_FLAT_NAME: dc_hostname = r->logon29.pdc_name; -- cgit From 9adc40a38fd0e5dc0ad9de4654c8bc6a05a19d7b Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 21:06:23 +0200 Subject: dsgetdcname: simply call ourself with DS_FORCE_REDISCOVERY after cache expiry. Guenther (This used to be commit 847f258632f6d49a3fd45f466c5d3d8c6222ff85) --- source3/libsmb/dsgetdcname.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 388c7be395..247cfd3526 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -196,22 +196,14 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, const char *site_name, struct netr_DsRGetDCNameInfo *info) { - uint32_t nt_version = NETLOGON_VERSION_1; - - /* check if matching entry is older then 15 minutes, if yes, send - * CLDAP/MAILSLOT ping again and store the cached data */ - - if (ads_cldap_netlogon(mem_ctx, info->dc_unc, - info->domain_name, &nt_version, NULL)) { - - dsgetdcname_cache_delete(mem_ctx, domain_name); - - return dsgetdcname_cache_store(mem_ctx, - info->domain_name, - info); - } - - return NT_STATUS_INVALID_NETWORK_RESPONSE; + struct netr_DsRGetDCNameInfo *dc_info; + + return dsgetdcname(mem_ctx, + domain_name, + domain_guid, + site_name, + flags | DS_FORCE_REDISCOVERY, + &dc_info); } /**************************************************************** -- cgit From 5d7a60afd8ab7e84eef6b5726e162d9b861df7b9 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 21:08:20 +0200 Subject: dsgetdcname: pure cosmetics. Guenther (This used to be commit 4b56c294e8ba045c84cab538b3d286e433d292ed) --- source3/libsmb/dsgetdcname.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 247cfd3526..4cafc71ff2 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -945,7 +945,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, const char *dc_name = NULL; fstring tmp_dc_name; struct messaging_context *msg_ctx = msg_context(mem_ctx); - union nbt_cldap_netlogon *reply = NULL; + union nbt_cldap_netlogon *r = NULL; uint32_t nt_version = NETLOGON_VERSION_1 | NETLOGON_VERSION_5 | NETLOGON_VERSION_5EX_WITH_IP; @@ -979,7 +979,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, domain_name, &nt_version, &dc_name, - &reply)) { + &r)) { namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list); goto make_reply; } @@ -995,8 +995,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, { struct nbt_cldap_netlogon_1 logon1; - reply = TALLOC_ZERO_P(mem_ctx, union nbt_cldap_netlogon); - NT_STATUS_HAVE_NO_MEMORY(reply); + r = TALLOC_ZERO_P(mem_ctx, union nbt_cldap_netlogon); + NT_STATUS_HAVE_NO_MEMORY(r); ZERO_STRUCT(logon1); @@ -1007,7 +1007,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, logon1.domain_name = talloc_strdup_upper(mem_ctx, domain_name); NT_STATUS_HAVE_NO_MEMORY(logon1.domain_name); - reply->logon1 = logon1; + r->logon1 = logon1; namecache_store(tmp_dc_name, NBT_NAME_SERVER, 1, &ip_list); @@ -1020,7 +1020,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, make_reply: return make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, - nt_version, reply, info); + nt_version, r, info); } /**************************************************************** -- cgit From 5e24d83e417931409eaa66a5e09dcd3b12ad162f Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 21:25:05 +0200 Subject: dsgetdcname: fix gencache store for dsgetdcname(). While storing always a type 29 reply structure in gencache, we are now able to deliver correct data according to return flags such as DS_RETURN_FLAT_NAME and DS_RETURN_DNS_NAME out of the cached data from gencache. Guenther (This used to be commit c67b6dc0ca866781043e443177d550e23b83ae36) --- source3/libsmb/dsgetdcname.c | 204 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 184 insertions(+), 20 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 4cafc71ff2..208daf334c 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -32,6 +32,13 @@ struct ip_service_name { const char *hostname; }; +static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, + uint32_t flags, + struct sockaddr_storage *ss, + uint32_t nt_version, + union nbt_cldap_netlogon *r, + struct netr_DsRGetDCNameInfo **info); + /**************************************************************** ****************************************************************/ @@ -148,13 +155,11 @@ static NTSTATUS dsgetdcname_cache_delete(TALLOC_CTX *mem_ctx, static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, const char *domain_name, - struct netr_DsRGetDCNameInfo *info) + const DATA_BLOB *blob) { time_t expire_time; char *key; bool ret = false; - DATA_BLOB blob; - enum ndr_err_code ndr_err; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -167,19 +172,11 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; - ndr_err = ndr_push_struct_blob(&blob, mem_ctx, info, - (ndr_push_flags_fn_t)ndr_push_netr_DsRGetDCNameInfo); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - return ndr_map_error2ntstatus(ndr_err); - } - if (gencache_lock_entry(key) != 0) { - data_blob_free(&blob); return NT_STATUS_LOCK_NOT_GRANTED; } - ret = gencache_set_data_blob(key, &blob, expire_time); - data_blob_free(&blob); + ret = gencache_set_data_blob(key, blob, expire_time); gencache_unlock_entry(key); @@ -189,6 +186,149 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ +#define SET_STRING(x) \ + talloc_strdup(mem_ctx, x); \ + NT_STATUS_HAVE_NO_MEMORY(x); + +static NTSTATUS map_logon29_from_cldap_reply(TALLOC_CTX *mem_ctx, + uint32_t flags, + struct sockaddr_storage *ss, + uint32_t nt_version, + union nbt_cldap_netlogon *r, + struct nbt_cldap_netlogon_29 *p) +{ + char addr[INET6_ADDRSTRLEN]; + + ZERO_STRUCTP(p); + + print_sockaddr(addr, sizeof(addr), ss); + p->dc_sock_addr_size = 0x10; + p->dc_sock_addr.sa_family = 2; + p->dc_sock_addr.pdc_ip = talloc_strdup(mem_ctx, addr); + + switch (nt_version & 0x000000ff) { + case 0: + return NT_STATUS_INVALID_PARAMETER; + case 1: + p->pdc_name = SET_STRING(r->logon1.pdc_name); + p->domain = SET_STRING(r->logon1.domain_name); + + if (flags & DS_PDC_REQUIRED) { + p->server_type = NBT_SERVER_WRITABLE | + NBT_SERVER_PDC; + } + break; + case 2: + case 3: + p->pdc_name = SET_STRING(r->logon3.pdc_name); + p->domain = SET_STRING(r->logon3.domain_name); + p->pdc_dns_name = SET_STRING(r->logon3.pdc_dns_name); + p->dns_domain = SET_STRING(r->logon3.dns_domain); + p->server_type = r->logon3.server_type; + p->forest = SET_STRING(r->logon3.forest); + p->domain_uuid = r->logon3.domain_uuid; + + break; + case 4: + case 5: + case 6: + case 7: + p->pdc_name = SET_STRING(r->logon5.pdc_name); + p->domain = SET_STRING(r->logon5.domain); + p->pdc_dns_name = SET_STRING(r->logon5.pdc_dns_name); + p->dns_domain = SET_STRING(r->logon5.dns_domain); + p->server_type = r->logon5.server_type; + p->forest = SET_STRING(r->logon5.forest); + p->domain_uuid = r->logon5.domain_uuid; + p->server_site = SET_STRING(r->logon5.server_site); + p->client_site = SET_STRING(r->logon5.client_site); + + break; + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + p->pdc_name = SET_STRING(r->logon13.pdc_name); + p->domain = SET_STRING(r->logon13.domain); + p->pdc_dns_name = SET_STRING(r->logon13.pdc_dns_name); + p->dns_domain = SET_STRING(r->logon13.dns_domain); + p->server_type = r->logon13.server_type; + p->forest = SET_STRING(r->logon13.forest); + p->domain_uuid = r->logon13.domain_uuid; + p->server_site = SET_STRING(r->logon13.server_site); + p->client_site = SET_STRING(r->logon13.client_site); + + break; + default: + p->pdc_name = SET_STRING(r->logon29.pdc_name); + p->domain = SET_STRING(r->logon29.domain); + p->pdc_dns_name = SET_STRING(r->logon29.pdc_dns_name); + p->dns_domain = SET_STRING(r->logon29.dns_domain); + p->server_type = r->logon29.server_type; + p->forest = SET_STRING(r->logon29.forest); + p->domain_uuid = r->logon29.domain_uuid; + p->server_site = SET_STRING(r->logon29.server_site); + p->client_site = SET_STRING(r->logon29.client_site); + p->next_closest_site = SET_STRING(r->logon29.next_closest_site); + + break; + } + + return NT_STATUS_OK; +} + +/**************************************************************** +****************************************************************/ + +static NTSTATUS store_cldap_reply(TALLOC_CTX *mem_ctx, + uint32_t flags, + struct sockaddr_storage *ss, + uint32_t nt_version, + union nbt_cldap_netlogon *r) +{ + DATA_BLOB blob; + enum ndr_err_code ndr_err; + NTSTATUS status; + struct nbt_cldap_netlogon_29 logon29; + + status = map_logon29_from_cldap_reply(mem_ctx, flags, ss, + nt_version, r, &logon29); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + ndr_err = ndr_push_struct_blob(&blob, mem_ctx, &logon29, + (ndr_push_flags_fn_t)ndr_push_nbt_cldap_netlogon_29); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + return ndr_map_error2ntstatus(ndr_err); + } + + if (logon29.domain) { + status = dsgetdcname_cache_store(mem_ctx, logon29.domain, &blob); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + } + if (logon29.dns_domain) { + status = dsgetdcname_cache_store(mem_ctx, logon29.dns_domain, &blob); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + } + + done: + data_blob_free(&blob); + + return status; +} + +/**************************************************************** +****************************************************************/ + static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, const char *domain_name, struct GUID *domain_guid, @@ -290,6 +430,9 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, DATA_BLOB blob; enum ndr_err_code ndr_err; struct netr_DsRGetDCNameInfo *info; + union nbt_cldap_netlogon p; + struct nbt_cldap_netlogon_29 r; + NTSTATUS status; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -309,8 +452,8 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, return NT_STATUS_NO_MEMORY; } - ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, info, - (ndr_pull_flags_fn_t)ndr_pull_netr_DsRGetDCNameInfo); + ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r, + (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon_29); data_blob_free(&blob); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { @@ -318,6 +461,15 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, return ndr_map_error2ntstatus(ndr_err); } + p.logon29 = r; + + status = make_dc_info_from_cldap_reply(mem_ctx, flags, NULL, + NETLOGON_VERSION_WITH_CLOSEST_SITE, + &p, &info); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + if (DEBUGLEVEL >= 10) { NDR_PRINT_DEBUG(netr_DsRGetDCNameInfo, info); } @@ -869,6 +1021,7 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, uint32_t nt_version = NETLOGON_VERSION_5 | NETLOGON_VERSION_5EX; uint32_t ret_flags = 0; + NTSTATUS status; nt_version |= map_ds_flags_to_nt_version(flags); @@ -896,8 +1049,14 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; } - return make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, - nt_version, r, info); + status = make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, + nt_version, r, info); + if (NT_STATUS_IS_OK(status)) { + return store_cldap_reply(mem_ctx, flags, &dclist[i].ss, + nt_version, r); + } + + return status; } /**************************************************************** @@ -940,7 +1099,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, struct sockaddr_storage ss; struct ip_service ip_list; enum nbt_name_type name_type = NBT_NAME_LOGON; - + NTSTATUS status; int i; const char *dc_name = NULL; fstring tmp_dc_name; @@ -1019,8 +1178,14 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, make_reply: - return make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, - nt_version, r, info); + status = make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, + nt_version, r, info); + if (NT_STATUS_IS_OK(status)) { + return store_cldap_reply(mem_ctx, flags, &dclist[i].ss, + nt_version, r); + } + + return status; } /**************************************************************** @@ -1129,7 +1294,6 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, &myinfo); if (NT_STATUS_IS_OK(status)) { - dsgetdcname_cache_store(mem_ctx, domain_name, myinfo); *info = myinfo; } -- cgit From 4bd94c8338bef61477170bc41a8073739d55d812 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 7 May 2008 21:31:59 +0200 Subject: cldap: move out cldap object to fix the build. Guenther (This used to be commit 56be9c98d24e64bf855439df21766d30f448f407) --- source3/libsmb/dsgetdcname.c | 84 -------------------------------------------- 1 file changed, 84 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 208daf334c..0db457a45a 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -1299,87 +1299,3 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, return status; } - -/**************************************************************** -****************************************************************/ - -bool pull_mailslot_cldap_reply(TALLOC_CTX *mem_ctx, - const DATA_BLOB *blob, - union nbt_cldap_netlogon *r, - uint32_t *nt_version) -{ - enum ndr_err_code ndr_err; - uint32_t nt_version_query = ((*nt_version) & 0x000000ff); - uint16_t command = 0; - - ndr_err = ndr_pull_struct_blob(blob, mem_ctx, &command, - (ndr_pull_flags_fn_t)ndr_pull_uint16); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - return false; - } - - switch (command) { - case 0x13: /* 19 */ - case 0x15: /* 21 */ - case 0x17: /* 23 */ - break; - default: - DEBUG(1,("got unexpected command: %d (0x%08x)\n", - command, command)); - return false; - } - - ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, - (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); - if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - goto done; - } - - /* when the caller requested just those nt_version bits that the server - * was able to reply to, we are fine and all done. otherwise we need to - * assume downgraded replies which are painfully parsed here - gd */ - - if (nt_version_query & NETLOGON_VERSION_WITH_CLOSEST_SITE) { - nt_version_query &= ~NETLOGON_VERSION_WITH_CLOSEST_SITE; - } - ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, - (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); - if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - goto done; - } - if (nt_version_query & NETLOGON_VERSION_5EX_WITH_IP) { - nt_version_query &= ~NETLOGON_VERSION_5EX_WITH_IP; - } - ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, - (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); - if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - goto done; - } - if (nt_version_query & NETLOGON_VERSION_5EX) { - nt_version_query &= ~NETLOGON_VERSION_5EX; - } - ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, - (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); - if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - goto done; - } - if (nt_version_query & NETLOGON_VERSION_5) { - nt_version_query &= ~NETLOGON_VERSION_5; - } - ndr_err = ndr_pull_union_blob_all(blob, mem_ctx, r, nt_version_query, - (ndr_pull_flags_fn_t)ndr_pull_nbt_cldap_netlogon); - if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - goto done; - } - - return false; - - done: - if (DEBUGLEVEL >= 10) { - NDR_PRINT_UNION_DEBUG(nbt_cldap_netlogon, nt_version_query, r); - } - - *nt_version = nt_version_query; - - return true; -} -- cgit From e668cb45941b4cbe7dbcb5bb2e4de3fb1d3784de Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 8 May 2008 12:16:04 +0200 Subject: dsgetdcname: add map_dc_and_domain_names() for consolidating returned names. Guenther (This used to be commit eb7fee6e2a00326c03aa013058247e06279a4930) --- source3/libsmb/dsgetdcname.c | 129 ++++++++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 50 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 0db457a45a..2c8f42399f 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -812,6 +812,44 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ +static void map_dc_and_domain_names(uint32_t flags, + const char *dc_name, + const char *domain_name, + const char *dns_dc_name, + const char *dns_domain_name, + uint32_t *dc_flags, + const char **hostname_p, + const char **domain_p) +{ + switch (flags & 0xf0000000) { + case DS_RETURN_FLAT_NAME: + if (dc_name && domain_name && + *dc_name && *domain_name) { + *hostname_p = dc_name; + *domain_p = domain_name; + break; + } + case DS_RETURN_DNS_NAME: + default: + if (dns_dc_name && dns_domain_name && + *dns_dc_name && *dns_domain_name) { + *hostname_p = dns_dc_name; + *domain_p = dns_domain_name; + *dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; + break; + } + if (dc_name && domain_name && + *dc_name && *domain_name) { + *hostname_p = dc_name; + *domain_p = domain_name; + break; + } + } +} + +/**************************************************************** +****************************************************************/ + static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, uint32_t flags, struct sockaddr_storage *ss, @@ -845,8 +883,15 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_address_type = DS_ADDRESS_TYPE_NETBIOS; } - dc_hostname = r->logon1.pdc_name; - dc_domain_name = r->logon1.domain_name; + map_dc_and_domain_names(flags, + r->logon1.pdc_name, + r->logon1.domain_name, + NULL, + NULL, + &dc_flags, + &dc_hostname, + &dc_domain_name); + if (flags & DS_PDC_REQUIRED) { dc_flags = NBT_SERVER_WRITABLE | NBT_SERVER_PDC; } @@ -858,18 +903,14 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_address_type = DS_ADDRESS_TYPE_INET; } - switch (flags & 0xf0000000) { - case DS_RETURN_FLAT_NAME: - dc_hostname = r->logon3.pdc_name; - dc_domain_name = r->logon3.domain_name; - break; - case DS_RETURN_DNS_NAME: - default: - dc_hostname = r->logon3.pdc_dns_name; - dc_domain_name = r->logon3.dns_domain; - dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; - break; - } + map_dc_and_domain_names(flags, + r->logon3.pdc_name, + r->logon3.domain_name, + r->logon3.pdc_dns_name, + r->logon3.dns_domain, + &dc_flags, + &dc_hostname, + &dc_domain_name); dc_flags |= r->logon3.server_type; dc_forest = r->logon3.forest; @@ -885,18 +926,14 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_address_type = DS_ADDRESS_TYPE_NETBIOS; } - switch (flags & 0xf0000000) { - case DS_RETURN_FLAT_NAME: - dc_hostname = r->logon5.pdc_name; - dc_domain_name = r->logon5.domain; - break; - case DS_RETURN_DNS_NAME: - default: - dc_hostname = r->logon5.pdc_dns_name; - dc_domain_name = r->logon5.dns_domain; - dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; - break; - } + map_dc_and_domain_names(flags, + r->logon5.pdc_name, + r->logon5.domain, + r->logon5.pdc_dns_name, + r->logon5.dns_domain, + &dc_flags, + &dc_hostname, + &dc_domain_name); dc_flags |= r->logon5.server_type; dc_forest = r->logon5.forest; @@ -918,18 +955,14 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_address_type = DS_ADDRESS_TYPE_INET; } - switch (flags & 0xf0000000) { - case DS_RETURN_FLAT_NAME: - dc_hostname = r->logon13.pdc_name; - dc_domain_name = r->logon13.domain; - break; - case DS_RETURN_DNS_NAME: - default: - dc_hostname = r->logon13.pdc_dns_name; - dc_domain_name = r->logon13.dns_domain; - dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; - break; - } + map_dc_and_domain_names(flags, + r->logon13.pdc_name, + r->logon13.domain, + r->logon13.pdc_dns_name, + r->logon13.dns_domain, + &dc_flags, + &dc_hostname, + &dc_domain_name); dc_flags |= r->logon13.server_type; dc_forest = r->logon13.forest; @@ -944,18 +977,14 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_address_type = DS_ADDRESS_TYPE_INET; } - switch (flags & 0xf0000000) { - case DS_RETURN_FLAT_NAME: - dc_hostname = r->logon29.pdc_name; - dc_domain_name = r->logon29.domain; - break; - case DS_RETURN_DNS_NAME: - default: - dc_hostname = r->logon29.pdc_dns_name; - dc_domain_name = r->logon29.dns_domain; - dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER; - break; - } + map_dc_and_domain_names(flags, + r->logon29.pdc_name, + r->logon29.domain, + r->logon29.pdc_dns_name, + r->logon29.dns_domain, + &dc_flags, + &dc_hostname, + &dc_domain_name); dc_flags |= r->logon29.server_type; dc_forest = r->logon29.forest; -- cgit From c58ab8f3b251f9fbf79fc8a528717e0756c02a76 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 8 May 2008 14:24:46 +0200 Subject: dsgetdcname: the forest name should never be empty. Guenther (This used to be commit 2c0a96f1e5fc065fdbeb5671cfa693009321dde8) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 2c8f42399f..8021f8f054 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -785,7 +785,7 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx, NT_STATUS_HAVE_NO_MEMORY(info->domain_name); } - if (forest_name) { + if (forest_name && *forest_name) { info->forest_name = talloc_strdup(mem_ctx, forest_name); NT_STATUS_HAVE_NO_MEMORY(info->forest_name); flags |= DS_DNS_FOREST; -- cgit From 67c644aa591c051cfe1e3f3536186ecf0b4449f2 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 8 May 2008 18:32:22 +0200 Subject: dsgetdcname: use existing messaging_context if possible. Guenther (This used to be commit 7889516a384c155a9045aad4409c041fddd0d98d) --- source3/libsmb/dsgetdcname.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 8021f8f054..d414d24783 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -330,6 +330,7 @@ static NTSTATUS store_cldap_reply(TALLOC_CTX *mem_ctx, ****************************************************************/ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, const char *domain_name, struct GUID *domain_guid, uint32_t flags, @@ -339,6 +340,7 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, struct netr_DsRGetDCNameInfo *dc_info; return dsgetdcname(mem_ctx, + msg_ctx, domain_name, domain_guid, site_name, @@ -494,6 +496,7 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, ****************************************************************/ static NTSTATUS dsgetdcname_cached(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, const char *domain_name, struct GUID *domain_guid, uint32_t flags, @@ -516,7 +519,8 @@ static NTSTATUS dsgetdcname_cached(TALLOC_CTX *mem_ctx, } if (expired) { - status = dsgetdcname_cache_refresh(mem_ctx, domain_name, + status = dsgetdcname_cache_refresh(mem_ctx, msg_ctx, + domain_name, domain_guid, flags, site_name, *info); if (!NT_STATUS_IS_OK(status)) { @@ -1119,6 +1123,7 @@ static struct messaging_context *msg_context(TALLOC_CTX *mem_ctx) ****************************************************************/ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, const char *domain_name, uint32_t flags, struct ip_service_name *dclist, @@ -1132,12 +1137,15 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, int i; const char *dc_name = NULL; fstring tmp_dc_name; - struct messaging_context *msg_ctx = msg_context(mem_ctx); union nbt_cldap_netlogon *r = NULL; uint32_t nt_version = NETLOGON_VERSION_1 | NETLOGON_VERSION_5 | NETLOGON_VERSION_5EX_WITH_IP; + if (!msg_ctx) { + msg_ctx = msg_context(mem_ctx); + } + if (flags & DS_PDC_REQUIRED) { name_type = NBT_NAME_PDC; } @@ -1221,6 +1229,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, ****************************************************************/ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, const char *domain_name, struct GUID *domain_guid, uint32_t flags, @@ -1239,7 +1248,7 @@ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, &dclist, &num_dcs); NT_STATUS_NOT_OK_RETURN(status); - return process_dc_netbios(mem_ctx, domain_name, flags, + return process_dc_netbios(mem_ctx, msg_ctx, domain_name, flags, dclist, num_dcs, info); } @@ -1269,7 +1278,7 @@ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, &num_dcs); NT_STATUS_NOT_OK_RETURN(status); - return process_dc_netbios(mem_ctx, domain_name, flags, dclist, + return process_dc_netbios(mem_ctx, msg_ctx, domain_name, flags, dclist, num_dcs, info); } @@ -1280,6 +1289,7 @@ static NTSTATUS dsgetdcname_rediscover(TALLOC_CTX *mem_ctx, ********************************************************************/ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, const char *domain_name, struct GUID *domain_guid, const char *site_name, @@ -1306,7 +1316,7 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, goto rediscover; } - status = dsgetdcname_cached(mem_ctx, domain_name, domain_guid, + status = dsgetdcname_cached(mem_ctx, msg_ctx, domain_name, domain_guid, flags, site_name, &myinfo); if (NT_STATUS_IS_OK(status)) { *info = myinfo; @@ -1318,7 +1328,7 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, } rediscover: - status = dsgetdcname_rediscover(mem_ctx, domain_name, + status = dsgetdcname_rediscover(mem_ctx, msg_ctx, domain_name, domain_guid, flags, site_name, &myinfo); -- cgit From d59cf703ba5d6ac18e4399d12b043d5e68230403 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 9 May 2008 17:41:50 +0200 Subject: dsgetdcname: make use of nbt_cldap_netlogon_15. Guenther (This used to be commit 5b0eda98f3d127399770f7a037ad3277dbe23393) --- source3/libsmb/dsgetdcname.c | 99 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 8 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index d414d24783..43c9699ce7 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -206,10 +206,12 @@ static NTSTATUS map_logon29_from_cldap_reply(TALLOC_CTX *mem_ctx, p->dc_sock_addr.sa_family = 2; p->dc_sock_addr.pdc_ip = talloc_strdup(mem_ctx, addr); - switch (nt_version & 0x000000ff) { + switch (nt_version & 0x0000001f) { case 0: return NT_STATUS_INVALID_PARAMETER; case 1: + case 16: + case 17: p->pdc_name = SET_STRING(r->logon1.pdc_name); p->domain = SET_STRING(r->logon1.domain_name); @@ -220,6 +222,8 @@ static NTSTATUS map_logon29_from_cldap_reply(TALLOC_CTX *mem_ctx, break; case 2: case 3: + case 18: + case 19: p->pdc_name = SET_STRING(r->logon3.pdc_name); p->domain = SET_STRING(r->logon3.domain_name); p->pdc_dns_name = SET_STRING(r->logon3.pdc_dns_name); @@ -263,7 +267,29 @@ static NTSTATUS map_logon29_from_cldap_reply(TALLOC_CTX *mem_ctx, p->client_site = SET_STRING(r->logon13.client_site); break; - default: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + p->pdc_name = SET_STRING(r->logon15.pdc_name); + p->domain = SET_STRING(r->logon15.domain); + p->pdc_dns_name = SET_STRING(r->logon15.pdc_dns_name); + p->dns_domain = SET_STRING(r->logon15.dns_domain); + p->server_type = r->logon15.server_type; + p->forest = SET_STRING(r->logon15.forest); + p->domain_uuid = r->logon15.domain_uuid; + p->server_site = SET_STRING(r->logon15.server_site); + p->client_site = SET_STRING(r->logon15.client_site); + + break; + case 29: + case 30: + case 31: p->pdc_name = SET_STRING(r->logon29.pdc_name); p->domain = SET_STRING(r->logon29.domain); p->pdc_dns_name = SET_STRING(r->logon29.pdc_dns_name); @@ -276,6 +302,8 @@ static NTSTATUS map_logon29_from_cldap_reply(TALLOC_CTX *mem_ctx, p->next_closest_site = SET_STRING(r->logon29.next_closest_site); break; + default: + return NT_STATUS_INVALID_PARAMETER; } return NT_STATUS_OK; @@ -354,12 +382,16 @@ static NTSTATUS dsgetdcname_cache_refresh(TALLOC_CTX *mem_ctx, static uint32_t get_cldap_reply_server_flags(union nbt_cldap_netlogon *r, uint32_t nt_version) { - switch (nt_version & 0x000000ff) { + switch (nt_version & 0x0000001f) { case 0: case 1: + case 16: + case 17: return 0; case 2: case 3: + case 18: + case 19: return r->logon3.server_type; case 4: case 5: @@ -375,8 +407,22 @@ static uint32_t get_cldap_reply_server_flags(union nbt_cldap_netlogon *r, case 14: case 15: return r->logon13.server_type; - default: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + return r->logon15.server_type; + case 29: + case 30: + case 31: return r->logon29.server_type; + default: + return 0; } } @@ -466,7 +512,7 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, p.logon29 = r; status = make_dc_info_from_cldap_reply(mem_ctx, flags, NULL, - NETLOGON_VERSION_WITH_CLOSEST_SITE, + 29, &p, &info); if (!NT_STATUS_IS_OK(status)) { return status; @@ -878,10 +924,11 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_address_type = DS_ADDRESS_TYPE_INET; } - switch (nt_version & 0x000000ff) { + switch (nt_version & 0x0000001f) { case 0: - return NT_STATUS_INVALID_PARAMETER; case 1: + case 16: + case 17: if (!ss) { dc_address = r->logon1.pdc_name; dc_address_type = DS_ADDRESS_TYPE_NETBIOS; @@ -902,6 +949,8 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, break; case 2: case 3: + case 18: + case 19: if (!ss) { dc_address = r->logon3.pdc_ip; dc_address_type = DS_ADDRESS_TYPE_INET; @@ -975,7 +1024,39 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_client_site = r->logon13.client_site; break; - default: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + if (!ss) { + dc_address = r->logon15.pdc_name; + dc_address_type = DS_ADDRESS_TYPE_NETBIOS; + } + + map_dc_and_domain_names(flags, + r->logon15.pdc_name, + r->logon15.domain, + r->logon15.pdc_dns_name, + r->logon15.dns_domain, + &dc_flags, + &dc_hostname, + &dc_domain_name); + + dc_flags |= r->logon15.server_type; + dc_forest = r->logon15.forest; + dc_domain_guid = &r->logon15.domain_uuid; + dc_server_site = r->logon15.server_site; + dc_client_site = r->logon15.client_site; + + break; + case 29: + case 30: + case 31: if (!ss) { dc_address = r->logon29.dc_sock_addr.pdc_ip; dc_address_type = DS_ADDRESS_TYPE_INET; @@ -997,6 +1078,8 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, dc_client_site = r->logon29.client_site; break; + default: + return NT_STATUS_INVALID_PARAMETER; } return make_domain_controller_info(mem_ctx, -- cgit From 1830d6b1599c93b81fd79b4cdc982f20263e1249 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 9 May 2008 17:56:04 +0200 Subject: dsgetdcname: add reminder that we need to support ipv6 here once we know how. Guenther (This used to be commit 4b3617bf505a835a6d4bb9b80c4ad837a2082dea) --- source3/libsmb/dsgetdcname.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 43c9699ce7..30d7c94822 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -202,8 +202,10 @@ static NTSTATUS map_logon29_from_cldap_reply(TALLOC_CTX *mem_ctx, ZERO_STRUCTP(p); print_sockaddr(addr, sizeof(addr), ss); - p->dc_sock_addr_size = 0x10; - p->dc_sock_addr.sa_family = 2; + + /* FIXME */ + p->dc_sock_addr_size = 0x10; /* the w32 winsock addr size */ + p->dc_sock_addr.sa_family = 2; /* AF_INET */ p->dc_sock_addr.pdc_ip = talloc_strdup(mem_ctx, addr); switch (nt_version & 0x0000001f) { -- cgit From 5547e5a416109524501c5c5be78efa0f8d10e749 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 14 May 2008 09:42:23 +0200 Subject: dsgetdcname: In case we didn't get a mailslot reply, don't cache the nodestatus. Guenther (This used to be commit 12e47be02f93e2f41af5772f6a83568b3574d032) --- source3/libsmb/dsgetdcname.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 30d7c94822..1538502e9a 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -1223,6 +1223,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, const char *dc_name = NULL; fstring tmp_dc_name; union nbt_cldap_netlogon *r = NULL; + bool store_cache = false; uint32_t nt_version = NETLOGON_VERSION_1 | NETLOGON_VERSION_5 | NETLOGON_VERSION_5EX_WITH_IP; @@ -1261,6 +1262,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, &nt_version, &dc_name, &r)) { + store_cache = true; namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list); goto make_reply; } @@ -1302,7 +1304,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, status = make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, nt_version, r, info); - if (NT_STATUS_IS_OK(status)) { + if (NT_STATUS_IS_OK(status) && store_cache) { return store_cldap_reply(mem_ctx, flags, &dclist[i].ss, nt_version, r); } -- cgit From 2e8b43c58d6d276ef5856816f0259df51ccd9837 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 15 May 2008 16:41:18 +0200 Subject: dsgetdcname: check for invalid sitename/flag combinations. Guenther (This used to be commit 255e509474cae92802e90613ccaddb6627ee77cd) --- source3/libsmb/dsgetdcname.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 1538502e9a..3326c10f5e 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -582,7 +582,8 @@ static NTSTATUS dsgetdcname_cached(TALLOC_CTX *mem_ctx, /**************************************************************** ****************************************************************/ -static bool check_allowed_required_flags(uint32_t flags) +static bool check_allowed_required_flags(uint32_t flags, + const char *site_name) { uint32_t return_type = flags & (DS_RETURN_FLAT_NAME|DS_RETURN_DNS_NAME); uint32_t offered_type = flags & (DS_IS_FLAT_NAME|DS_IS_DNS_NAME); @@ -593,6 +594,10 @@ static bool check_allowed_required_flags(uint32_t flags) debug_dsdcinfo_flags(10, flags); + if ((flags & DS_TRY_NEXTCLOSEST_SITE) && site_name) { + return false; + } + if (return_type == (DS_RETURN_FLAT_NAME|DS_RETURN_DNS_NAME)) { return false; } @@ -1394,7 +1399,7 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, *info = NULL; - if (!check_allowed_required_flags(flags)) { + if (!check_allowed_required_flags(flags, site_name)) { DEBUG(0,("invalid flags specified\n")); return NT_STATUS_INVALID_PARAMETER; } -- cgit From 4d593cdb19ec228adbf30cc8c408521e5770167c Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 15 May 2008 16:59:46 +0200 Subject: dsgetdcname: add site support. Guenther (This used to be commit e305368538eaa72e3008a5517db3708936924297) --- source3/libsmb/dsgetdcname.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 3326c10f5e..16148a39d5 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -1390,6 +1390,7 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, { NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; struct netr_DsRGetDCNameInfo *myinfo = NULL; + char *query_site = NULL; DEBUG(10,("dsgetdcname: domain_name: %s, " "domain_guid: %s, site_name: %s, flags: 0x%08x\n", @@ -1404,29 +1405,38 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, return NT_STATUS_INVALID_PARAMETER; } + if (!site_name) { + query_site = sitename_fetch(domain_name); + } else { + query_site = SMB_STRDUP(site_name); + } + if (flags & DS_FORCE_REDISCOVERY) { goto rediscover; } status = dsgetdcname_cached(mem_ctx, msg_ctx, domain_name, domain_guid, - flags, site_name, &myinfo); + flags, query_site, &myinfo); if (NT_STATUS_IS_OK(status)) { *info = myinfo; - return status; + goto done; } if (flags & DS_BACKGROUND_ONLY) { - return status; + goto done; } rediscover: status = dsgetdcname_rediscover(mem_ctx, msg_ctx, domain_name, - domain_guid, flags, site_name, + domain_guid, flags, query_site, &myinfo); if (NT_STATUS_IS_OK(status)) { *info = myinfo; } + done: + SAFE_FREE(query_site); + return status; } -- cgit From 175cca17299421df74831eec9ab2f43994087e5c Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 15 May 2008 17:47:07 +0200 Subject: dsgetdcname: store client sitename for mailslot and cldap replies. Guenther (This used to be commit a01ed719c31998620927dc9b1664ba8e36bd9b21) --- source3/libsmb/dsgetdcname.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 16148a39d5..d57689cd48 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -342,12 +342,18 @@ static NTSTATUS store_cldap_reply(TALLOC_CTX *mem_ctx, if (!NT_STATUS_IS_OK(status)) { goto done; } + if (logon29.client_site) { + sitename_store(logon29.domain, logon29.client_site); + } } if (logon29.dns_domain) { status = dsgetdcname_cache_store(mem_ctx, logon29.dns_domain, &blob); if (!NT_STATUS_IS_OK(status)) { goto done; } + if (logon29.client_site) { + sitename_store(logon29.dns_domain, logon29.client_site); + } } done: -- cgit From aacfa7b3ad7060245d906ea49c39533a6f509f26 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 25 May 2008 13:44:59 +0200 Subject: Fix two bogus uninitalized variable warnings (This used to be commit 194ea682d9a5c12a0125fecc20349ca9cc3d3ea1) --- source3/libsmb/dsgetdcname.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index d57689cd48..be38db1a3a 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -920,7 +920,8 @@ static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx, union nbt_cldap_netlogon *r, struct netr_DsRGetDCNameInfo **info) { - const char *dc_hostname, *dc_domain_name; + const char *dc_hostname = NULL; + const char *dc_domain_name = NULL; const char *dc_address = NULL; const char *dc_forest = NULL; uint32_t dc_address_type = 0; -- cgit From c73cc63e9204c8ffcca06aea1073862eba42e701 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 27 May 2008 11:40:50 +0200 Subject: dsgetdcname: use family (instead of sa_family). Guenther (This used to be commit 355fb81e9e42e507717f33a11793258db9169199) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index be38db1a3a..8d75593ddc 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -205,7 +205,7 @@ static NTSTATUS map_logon29_from_cldap_reply(TALLOC_CTX *mem_ctx, /* FIXME */ p->dc_sock_addr_size = 0x10; /* the w32 winsock addr size */ - p->dc_sock_addr.sa_family = 2; /* AF_INET */ + p->dc_sock_addr.family = 2; /* AF_INET */ p->dc_sock_addr.pdc_ip = talloc_strdup(mem_ctx, addr); switch (nt_version & 0x0000001f) { -- cgit From 513bc4e791676e18c448c21c5392cb9b05a49fa4 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 17 Jun 2008 16:18:50 +0200 Subject: dsgetdcname: allow to use NULL mem_ctx. Guenther (This used to be commit d20353d30c2e08a6c6d67ae8b8c2faa26004249c) --- source3/libsmb/dsgetdcname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 8d75593ddc..2a445cbd5a 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -119,7 +119,7 @@ void debug_dsdcinfo_flags(int lvl, uint32_t flags) static char *dsgetdcname_cache_key(TALLOC_CTX *mem_ctx, const char *domain) { - if (!mem_ctx || !domain) { + if (!domain) { return NULL; } -- cgit From 352b5c18579c9610c15e5c24e012e60cd972b95a Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 3 Jul 2008 16:24:27 +0200 Subject: Remove gencache_[un]lock_entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Günther agreed that it might be unnecessary in dsgetdcname_cache_store() :-) (This used to be commit 7a5a575ffe5196caecedc93970a25abfbe6f8059) --- source3/libsmb/dsgetdcname.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 2a445cbd5a..afc87030d0 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -159,7 +159,6 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, { time_t expire_time; char *key; - bool ret = false; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -172,15 +171,8 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; - if (gencache_lock_entry(key) != 0) { - return NT_STATUS_LOCK_NOT_GRANTED; - } - - ret = gencache_set_data_blob(key, blob, expire_time); - - gencache_unlock_entry(key); - - return ret ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return gencache_set_data_blob(key, blob, expire_time) + ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } /**************************************************************** -- cgit From d670d0a09bec3b6900421df17fc9d959545ee953 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 11 Jul 2008 17:44:09 +0200 Subject: Revert "Remove gencache_[un]lock_entry" This reverts commit 7a5a575ffe5196caecedc93970a25abfbe6f8059. (This used to be commit 62e444dd50ae974c2ab9a553cdf7f188a8f2c538) --- source3/libsmb/dsgetdcname.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/dsgetdcname.c') diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index afc87030d0..2a445cbd5a 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -159,6 +159,7 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, { time_t expire_time; char *key; + bool ret = false; if (!gencache_init()) { return NT_STATUS_INTERNAL_DB_ERROR; @@ -171,8 +172,15 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx, expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL; - return gencache_set_data_blob(key, blob, expire_time) - ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + if (gencache_lock_entry(key) != 0) { + return NT_STATUS_LOCK_NOT_GRANTED; + } + + ret = gencache_set_data_blob(key, blob, expire_time); + + gencache_unlock_entry(key); + + return ret ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } /**************************************************************** -- cgit