*/
#include "includes.h"
+#include "libsmb/dsgetdcname.h"
+#include "libsmb/namequery.h"
#include "libads/sitename_cache.h"
#include "../librpc/gen_ndr/ndr_netlogon.h"
#include "libads/cldap.h"
const char *hostname;
};
-static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx,
- uint32_t flags,
- struct sockaddr_storage *ss,
- struct NETLOGON_SAM_LOGON_RESPONSE_EX *r,
- struct netr_DsRGetDCNameInfo **info);
+static NTSTATUS make_dc_info_from_cldap_reply(
+ TALLOC_CTX *mem_ctx,
+ uint32_t flags,
+ const struct sockaddr_storage *ss,
+ struct NETLOGON_SAM_LOGON_RESPONSE_EX *r,
+ struct netr_DsRGetDCNameInfo **info);
/****************************************************************
****************************************************************/
-void debug_dsdcinfo_flags(int lvl, uint32_t flags)
+static void debug_dsdcinfo_flags(int lvl, uint32_t flags)
{
DEBUG(lvl,("debug_dsdcinfo_flags: 0x%08x\n\t", flags));
static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx,
const char *domain_name,
- const DATA_BLOB *blob)
+ DATA_BLOB blob)
{
time_t expire_time;
char *key;
}
if (r->domain_name) {
- status = dsgetdcname_cache_store(mem_ctx, r->domain_name, &blob);
+ status = dsgetdcname_cache_store(mem_ctx, r->domain_name,
+ blob);
if (!NT_STATUS_IS_OK(status)) {
goto done;
}
}
}
if (r->dns_domain) {
- status = dsgetdcname_cache_store(mem_ctx, r->dns_domain, &blob);
+ status = dsgetdcname_cache_store(mem_ctx, r->dns_domain, blob);
if (!NT_STATUS_IS_OK(status)) {
goto done;
}
/****************************************************************
****************************************************************/
-#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 (ret_flags == 0) {
- return true;
- }
-
- if (req_flags & DS_PDC_REQUIRED)
- RETURN_ON_FALSE(ret_flags & NBT_SERVER_PDC);
-
- if (req_flags & DS_GC_SERVER_REQUIRED)
- RETURN_ON_FALSE(ret_flags & NBT_SERVER_GC);
-
- if (req_flags & DS_ONLY_LDAP_NEEDED)
- 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 & NBT_SERVER_DS);
-
- if (req_flags & DS_KDC_REQUIRED)
- RETURN_ON_FALSE(ret_flags & NBT_SERVER_KDC);
-
- if (req_flags & DS_TIMESERV_REQUIRED)
- RETURN_ON_FALSE(ret_flags & NBT_SERVER_TIMESERV);
-
- if (req_flags & DS_WRITABLE_REQUIRED)
- RETURN_ON_FALSE(ret_flags & NBT_SERVER_WRITABLE);
-
- return true;
-}
-
-/****************************************************************
-****************************************************************/
-
static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx,
const char *domain_name,
const struct GUID *domain_guid,
return NT_STATUS_NO_MEMORY;
}
- if (!gencache_get_data_blob(key, &blob, NULL, NULL)) {
+ if (!gencache_get_data_blob(key, NULL, &blob, NULL, NULL)) {
return NT_STATUS_NOT_FOUND;
}
info = talloc_zero(mem_ctx, struct netr_DsRGetDCNameInfo);
if (!info) {
+ data_blob_free(&blob);
return NT_STATUS_NO_MEMORY;
}
*returned_dclist = NULL;
*returned_count = 0;
- if (lp_disable_netbios()) {
- return NT_STATUS_NOT_SUPPORTED;
- }
-
if (flags & DS_PDC_REQUIRED) {
name_type = NBT_NAME_PDC;
}
struct ip_service_name **returned_dclist,
int *return_count)
{
- int i, j;
+ int i;
+ size_t j;
NTSTATUS status;
struct dns_rr_srv *dcs = NULL;
int numdcs = 0;
int numaddrs = 0;
struct ip_service_name *dclist = NULL;
int count = 0;
- const char *dns_hosts_file;
- char *guid_string;
- dns_hosts_file = lp_parm_const_string(-1, "resolv", "host file", NULL);
if (flags & DS_PDC_REQUIRED) {
- status = ads_dns_query_pdc(mem_ctx, dns_hosts_file,
- domain_name, &dcs, &numdcs);
+ 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, dns_hosts_file,
- domain_name, site_name,
- &dcs, &numdcs);
+ 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, dns_hosts_file,
- domain_name, site_name,
- &dcs, &numdcs);
+ 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, dns_hosts_file,
- domain_name, site_name,
- &dcs, &numdcs);
+ status = ads_dns_query_dcs(mem_ctx,
+ domain_name,
+ site_name,
+ &dcs,
+ &numdcs);
} else if (domain_guid) {
- guid_string = GUID_string(mem_ctx, domain_guid);
- if (!guid_string) {
- return NT_STATUS_NO_MEMORY;
- }
-
- status = ads_dns_query_dcs_guid(mem_ctx, dns_hosts_file,
- domain_name, guid_string,
- &dcs, &numdcs);
- TALLOC_FREE(guid_string);
+ struct GUID_txt_buf buf;
+ GUID_buf_string(domain_guid, &buf);
+
+ status = ads_dns_query_dcs_guid(mem_ctx,
+ domain_name,
+ buf.buf,
+ &dcs,
+ &numdcs);
} else {
- status = ads_dns_query_dcs(mem_ctx, dns_hosts_file,
- domain_name, site_name,
- &dcs, &numdcs);
+ status = ads_dns_query_dcs(mem_ctx,
+ domain_name,
+ site_name,
+ &dcs,
+ &numdcs);
}
if (!NT_STATUS_IS_OK(status)) {
*domain_p = domain_name;
break;
}
+
+ FALL_THROUGH;
case DS_RETURN_DNS_NAME:
default:
if (dns_dc_name && dns_domain_name &&
/****************************************************************
****************************************************************/
-static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx,
- uint32_t flags,
- struct sockaddr_storage *ss,
- struct NETLOGON_SAM_LOGON_RESPONSE_EX *r,
- struct netr_DsRGetDCNameInfo **info)
+static NTSTATUS make_dc_info_from_cldap_reply(
+ TALLOC_CTX *mem_ctx,
+ uint32_t flags,
+ const struct sockaddr_storage *ss,
+ struct NETLOGON_SAM_LOGON_RESPONSE_EX *r,
+ struct netr_DsRGetDCNameInfo **info)
{
const char *dc_hostname = NULL;
const char *dc_domain_name = NULL;
print_sockaddr(addr, sizeof(addr), ss);
dc_address = addr;
dc_address_type = DS_ADDRESS_TYPE_INET;
- }
-
- if (!ss && r->sockaddr.pdc_ip) {
- dc_address = r->sockaddr.pdc_ip;
- dc_address_type = DS_ADDRESS_TYPE_INET;
} else {
- dc_address = r->pdc_name;
- dc_address_type = DS_ADDRESS_TYPE_NETBIOS;
+ if (r->sockaddr.pdc_ip) {
+ dc_address = r->sockaddr.pdc_ip;
+ dc_address_type = DS_ADDRESS_TYPE_INET;
+ } else {
+ dc_address = r->pdc_name;
+ dc_address_type = DS_ADDRESS_TYPE_NETBIOS;
+ }
}
map_dc_and_domain_names(flags,
for (i=0; i<num_dcs; i++) {
+ char addr[INET6_ADDRSTRLEN];
+ print_sockaddr(addr, sizeof(addr), &dclist[i].ss);
- DEBUG(10,("LDAP ping to %s\n", dclist[i].hostname));
+ DEBUG(10,("LDAP ping to %s (%s)\n", dclist[i].hostname, addr));
if (ads_cldap_netlogon(mem_ctx, &dclist[i].ss,
domain_name,
uint32_t nt_version = NETLOGON_NT_VERSION_1 |
NETLOGON_NT_VERSION_5 |
NETLOGON_NT_VERSION_5EX_WITH_IP;
+ size_t len = strlen(lp_netbios_name());
+ char my_acct_name[len+2];
if (msg_ctx == NULL) {
return NT_STATUS_INVALID_PARAMETER;
nt_version |= map_ds_flags_to_nt_version(flags);
+ snprintf(my_acct_name,
+ sizeof(my_acct_name),
+ "%s$",
+ lp_netbios_name());
+
DEBUG(10,("process_dc_netbios\n"));
for (i=0; i<num_dcs; i++) {
}
status = nbt_getdc(msg_ctx, 10, &dclist[i].ss, domain_name,
- NULL, nt_version,
+ NULL, my_acct_name, ACB_WSTRUST, nt_version,
mem_ctx, &nt_version, &dc_name, &r);
if (NT_STATUS_IS_OK(status)) {
store_cache = true;
if (flags & DS_IS_FLAT_NAME) {
+ if (lp_disable_netbios()) {
+ return NT_STATUS_NOT_SUPPORTED;
+ }
+
status = discover_dc_netbios(mem_ctx, domain_name, flags,
&dclist, &num_dcs);
NT_STATUS_NOT_OK_RETURN(status);
}
}
+ if (lp_disable_netbios()) {
+ return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
+ }
+
status = discover_dc_netbios(mem_ctx, domain_name, flags, &dclist,
&num_dcs);
NT_STATUS_NOT_OK_RETURN(status);
bool retry_query_with_null = false;
if ((site_name == NULL) || (site_name[0] == '\0')) {
- ptr_to_free = sitename_fetch(domain_name);
+ ptr_to_free = sitename_fetch(mem_ctx, domain_name);
if (ptr_to_free != NULL) {
retry_query_with_null = true;
}
flags,
info);
- SAFE_FREE(ptr_to_free);
+ TALLOC_FREE(ptr_to_free);
if (!NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) {
return status;