summaryrefslogtreecommitdiff
path: root/src/providers/ldap/ldap_common.c
diff options
context:
space:
mode:
authorJan Zeleny <jzeleny@redhat.com>2012-06-05 08:44:20 -0400
committerJakub Hrozek <jhrozek@redhat.com>2012-08-01 16:19:41 +0200
commitd7e3035f018828fcd41b0cc1c0012fab6012f782 (patch)
tree4015b81cfbc6e2a95967f1e08f36a548a91032a0 /src/providers/ldap/ldap_common.c
parentb418d3b65c95f02b82268188f17d27fc1b1b49f0 (diff)
downloadsssd-d7e3035f018828fcd41b0cc1c0012fab6012f782.tar.gz
sssd-d7e3035f018828fcd41b0cc1c0012fab6012f782.tar.bz2
sssd-d7e3035f018828fcd41b0cc1c0012fab6012f782.zip
Primary server support: LDAP adaptation
This patch adds support for the primary server functionality into LDAP provider. No backup servers are added at the moment, just the basic support is in place.
Diffstat (limited to 'src/providers/ldap/ldap_common.c')
-rw-r--r--src/providers/ldap/ldap_common.c111
1 files changed, 79 insertions, 32 deletions
diff --git a/src/providers/ldap/ldap_common.c b/src/providers/ldap/ldap_common.c
index 24c6e124..76236743 100644
--- a/src/providers/ldap/ldap_common.c
+++ b/src/providers/ldap/ldap_common.c
@@ -1072,7 +1072,7 @@ int sdap_gssapi_init(TALLOC_CTX *mem_ctx,
}
ret = krb5_service_init(mem_ctx, bectx, SSS_KRB5KDC_FO_SRV, krb5_servers,
- krb5_realm, &service);
+ NULL, krb5_realm, &service);
if (ret != EOK) {
DEBUG(0, ("Failed to init KRB5 failover service!\n"));
goto done;
@@ -1106,44 +1106,25 @@ done:
return ret;
}
-int sdap_service_init(TALLOC_CTX *memctx, struct be_ctx *ctx,
- const char *service_name, const char *dns_service_name,
- const char *urls, struct sdap_service **_service)
+errno_t sdap_urls_init(struct be_ctx *ctx,
+ struct sdap_service *service,
+ const char *service_name,
+ const char *dns_service_name,
+ const char *urls,
+ bool primary)
{
TALLOC_CTX *tmp_ctx;
- struct sdap_service *service;
- LDAPURLDesc *lud;
- char **list = NULL;
char *srv_user_data;
- int ret;
+ char **list = NULL;
+ LDAPURLDesc *lud;
+ errno_t ret;
int i;
- tmp_ctx = talloc_new(memctx);
+ tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
- service = talloc_zero(tmp_ctx, struct sdap_service);
- if (!service) {
- ret = ENOMEM;
- goto done;
- }
-
- ret = be_fo_add_service(ctx, service_name);
- if (ret != EOK) {
- DEBUG(1, ("Failed to create failover service!\n"));
- goto done;
- }
-
- service->name = talloc_strdup(service, service_name);
- if (!service->name) {
- ret = ENOMEM;
- goto done;
- }
-
- if (!urls) {
- urls = BE_SRV_IDENTIFIER;
- }
/* split server parm into a list */
ret = split_on_separator(tmp_ctx, urls, ',', true, &list, NULL);
@@ -1198,17 +1179,83 @@ int sdap_service_init(TALLOC_CTX *memctx, struct be_ctx *ctx,
talloc_steal(service, list[i]);
ret = be_fo_add_server(ctx, service->name, lud->lud_host,
- lud->lud_port, list[i], true);
+ lud->lud_port, list[i], primary);
ldap_free_urldesc(lud);
if (ret) {
goto done;
}
}
+done:
+ talloc_free(tmp_ctx);
+ return ret;
+}
+
+int sdap_service_init(TALLOC_CTX *memctx, struct be_ctx *ctx,
+ const char *service_name, const char *dns_service_name,
+ const char *urls, const char *backup_urls,
+ struct sdap_service **_service)
+{
+ TALLOC_CTX *tmp_ctx;
+ struct sdap_service *service;
+ int ret;
+
+ tmp_ctx = talloc_new(NULL);
+ if (!tmp_ctx) {
+ return ENOMEM;
+ }
+
+ service = talloc_zero(tmp_ctx, struct sdap_service);
+ if (!service) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = be_fo_add_service(ctx, service_name);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to create failover service!\n"));
+ goto done;
+ }
+
+ service->name = talloc_strdup(service, service_name);
+ if (!service->name) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ if (!urls) {
+ if (backup_urls) {
+ DEBUG(SSSDBG_CONF_SETTINGS, ("Missing primary LDAP URL but "
+ "backup URL given - using it "
+ "as primary!\n"));
+ urls = backup_urls;
+ backup_urls = NULL;
+ }
+ else {
+ DEBUG(SSSDBG_CONF_SETTINGS, ("Missing primary and backup LDAP "
+ "URLs - using service discovery!\n"));
+ urls = BE_SRV_IDENTIFIER;
+ }
+ }
+
+ ret = sdap_urls_init(ctx, service, service_name, dns_service_name,
+ urls, true);
+ if (ret != EOK) {
+ goto done;
+ }
+
+ if (backup_urls) {
+ ret = sdap_urls_init(ctx, service, service_name, dns_service_name,
+ backup_urls, false);
+ if (ret != EOK) {
+ goto done;
+ }
+ }
+
ret = be_fo_service_add_callback(memctx, ctx, service->name,
sdap_uri_callback, service);
if (ret != EOK) {
- DEBUG(1, ("Failed to add failover callback!\n"));
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to add failover callback!\n"));
goto done;
}