1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

s3:libads: split out ads_fill_cldap_reply() out of ads_try_connect()

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
This commit is contained in:
Stefan Metzmacher 2022-08-24 16:36:17 +02:00 committed by Andreas Schneider
parent c2e235efd4
commit ab6b9465ed

View File

@ -249,43 +249,23 @@ bool ads_closest_dc(ADS_STRUCT *ads)
return False; return False;
} }
static bool ads_fill_cldap_reply(ADS_STRUCT *ads,
/* bool gc,
try a connection to a given ldap server, returning True and setting the servers IP const struct sockaddr_storage *ss,
in the ads struct if successful const struct NETLOGON_SAM_LOGON_RESPONSE_EX *cldap_reply)
*/
static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
struct sockaddr_storage *ss)
{ {
struct NETLOGON_SAM_LOGON_RESPONSE_EX cldap_reply;
TALLOC_CTX *frame = talloc_stackframe(); TALLOC_CTX *frame = talloc_stackframe();
bool ret = false; bool ret = false;
char addr[INET6_ADDRSTRLEN]; char addr[INET6_ADDRSTRLEN];
ADS_STATUS status; ADS_STATUS status;
if (ss == NULL) {
TALLOC_FREE(frame);
return False;
}
print_sockaddr(addr, sizeof(addr), ss); print_sockaddr(addr, sizeof(addr), ss);
DEBUG(5,("ads_try_connect: sending CLDAP request to %s (realm: %s)\n",
addr, ads->server.realm));
ZERO_STRUCT( cldap_reply );
if ( !ads_cldap_netlogon_5(frame, ss, ads->server.realm, &cldap_reply ) ) {
DEBUG(3,("ads_try_connect: CLDAP request %s failed.\n", addr));
ret = false;
goto out;
}
/* Check the CLDAP reply flags */ /* Check the CLDAP reply flags */
if ( !(cldap_reply.server_type & NBT_SERVER_LDAP) ) { if (!(cldap_reply->server_type & NBT_SERVER_LDAP)) {
DEBUG(1,("ads_try_connect: %s's CLDAP reply says it is not an LDAP server!\n", DBG_WARNING("%s's CLDAP reply says it is not an LDAP server!\n",
addr)); addr);
ret = false; ret = false;
goto out; goto out;
} }
@ -299,14 +279,14 @@ static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
TALLOC_FREE(ads->config.client_site_name); TALLOC_FREE(ads->config.client_site_name);
TALLOC_FREE(ads->server.workgroup); TALLOC_FREE(ads->server.workgroup);
if (!check_cldap_reply_required_flags(cldap_reply.server_type, if (!check_cldap_reply_required_flags(cldap_reply->server_type,
ads->config.flags)) { ads->config.flags)) {
ret = false; ret = false;
goto out; goto out;
} }
ads->config.ldap_server_name = talloc_strdup(ads, ads->config.ldap_server_name = talloc_strdup(ads,
cldap_reply.pdc_dns_name); cldap_reply->pdc_dns_name);
if (ads->config.ldap_server_name == NULL) { if (ads->config.ldap_server_name == NULL) {
DBG_WARNING("Out of memory\n"); DBG_WARNING("Out of memory\n");
ret = false; ret = false;
@ -315,7 +295,7 @@ static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
ads->config.realm = talloc_asprintf_strupper_m(ads, ads->config.realm = talloc_asprintf_strupper_m(ads,
"%s", "%s",
cldap_reply.dns_domain); cldap_reply->dns_domain);
if (ads->config.realm == NULL) { if (ads->config.realm == NULL) {
DBG_WARNING("Out of memory\n"); DBG_WARNING("Out of memory\n");
ret = false; ret = false;
@ -330,9 +310,9 @@ static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
goto out; goto out;
} }
if (*cldap_reply.server_site) { if (*cldap_reply->server_site) {
ads->config.server_site_name = ads->config.server_site_name =
talloc_strdup(ads, cldap_reply.server_site); talloc_strdup(ads, cldap_reply->server_site);
if (ads->config.server_site_name == NULL) { if (ads->config.server_site_name == NULL) {
DBG_WARNING("Out of memory\n"); DBG_WARNING("Out of memory\n");
ret = false; ret = false;
@ -340,9 +320,9 @@ static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
} }
} }
if (*cldap_reply.client_site) { if (*cldap_reply->client_site) {
ads->config.client_site_name = ads->config.client_site_name =
talloc_strdup(ads, cldap_reply.client_site); talloc_strdup(ads, cldap_reply->client_site);
if (ads->config.client_site_name == NULL) { if (ads->config.client_site_name == NULL) {
DBG_WARNING("Out of memory\n"); DBG_WARNING("Out of memory\n");
ret = false; ret = false;
@ -350,7 +330,7 @@ static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
} }
} }
ads->server.workgroup = talloc_strdup(ads, cldap_reply.domain_name); ads->server.workgroup = talloc_strdup(ads, cldap_reply->domain_name);
if (ads->server.workgroup == NULL) { if (ads->server.workgroup == NULL) {
DBG_WARNING("Out of memory\n"); DBG_WARNING("Out of memory\n");
ret = false; ret = false;
@ -361,11 +341,11 @@ static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
ads->ldap.ss = *ss; ads->ldap.ss = *ss;
/* Store our site name. */ /* Store our site name. */
sitename_store( cldap_reply.domain_name, cldap_reply.client_site); sitename_store(cldap_reply->domain_name, cldap_reply->client_site);
sitename_store( cldap_reply.dns_domain, cldap_reply.client_site); sitename_store(cldap_reply->dns_domain, cldap_reply->client_site);
/* Leave this until last so that the flags are not clobbered */ /* Leave this until last so that the flags are not clobbered */
ads->config.flags = cldap_reply.server_type; ads->config.flags = cldap_reply->server_type;
ret = true; ret = true;
@ -375,6 +355,48 @@ static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
return ret; return ret;
} }
/*
try a connection to a given ldap server, returning True and setting the servers IP
in the ads struct if successful
*/
static bool ads_try_connect(ADS_STRUCT *ads, bool gc,
struct sockaddr_storage *ss)
{
struct NETLOGON_SAM_LOGON_RESPONSE_EX cldap_reply = {};
TALLOC_CTX *frame = talloc_stackframe();
bool ok;
char addr[INET6_ADDRSTRLEN] = { 0, };
if (ss == NULL) {
TALLOC_FREE(frame);
return false;
}
print_sockaddr(addr, sizeof(addr), ss);
DBG_INFO("ads_try_connect: sending CLDAP request to %s (realm: %s)\n",
addr, ads->server.realm);
ok = ads_cldap_netlogon_5(frame, ss, ads->server.realm, &cldap_reply);
if (!ok) {
DBG_NOTICE("ads_cldap_netlogon_5(%s, %s) failed.\n",
addr, ads->server.realm);
TALLOC_FREE(frame);
return false;
}
ok = ads_fill_cldap_reply(ads, gc, ss, &cldap_reply);
if (!ok) {
DBG_NOTICE("ads_fill_cldap_reply(%s, %s) failed.\n",
addr, ads->server.realm);
TALLOC_FREE(frame);
return false;
}
TALLOC_FREE(frame);
return true;
}
/********************************************************************** /**********************************************************************
send a cldap ping to list of servers, one at a time, until one of send a cldap ping to list of servers, one at a time, until one of
them answers it's an ldap server. Record success in the ADS_STRUCT. them answers it's an ldap server. Record success in the ADS_STRUCT.