From 2338eef6ec830dcbbc7e9f7bcebf31656e8742ec Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Fri, 17 May 2013 14:33:26 +0200 Subject: AD dyndns: extract the host name from URI --- src/providers/ad/ad_dyndns.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/providers/ad/ad_dyndns.c b/src/providers/ad/ad_dyndns.c index 4e9ed852f..da01426ca 100644 --- a/src/providers/ad/ad_dyndns.c +++ b/src/providers/ad/ad_dyndns.c @@ -159,6 +159,7 @@ static void ad_dyndns_nsupdate_done(struct tevent_req *req) struct ad_dyndns_update_state { struct ad_options *ad_ctx; + const char *servername; }; static void ad_dyndns_sdap_update_done(struct tevent_req *subreq); @@ -170,7 +171,7 @@ ad_dyndns_update_send(struct ad_options *ctx) struct ad_dyndns_update_state *state; struct tevent_req *req, *subreq; struct sdap_id_ctx *sdap_ctx = ctx->id_ctx->sdap_id_ctx; - const char *servername; + LDAPURLDesc *lud; DEBUG(SSSDBG_TRACE_FUNC, ("Performing update\n")); @@ -190,15 +191,36 @@ ad_dyndns_update_send(struct ad_options *ctx) } state->ad_ctx->dyndns_ctx->last_refresh = time(NULL); - if (strncmp(ctx->service->sdap->uri, - "ldap://", 7) != 0) { - DEBUG(SSSDBG_CRIT_FAILURE, ("Unexpected format of LDAP URI.\n")); - ret = EIO; + ret = ldap_url_parse(ctx->service->sdap->uri, &lud); + if (ret != LDAP_SUCCESS) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Failed to parse ldap URI (%s)!\n", ctx->service->sdap->uri)); + ret = EINVAL; goto done; } - servername = ctx->service->sdap->uri + 7; - if (!servername) { - ret = EIO; + + if (lud->lud_scheme != NULL && + strcasecmp(lud->lud_scheme, "ldapi") == 0) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("The LDAP scheme is ldapi://, cannot proceed with update\n")); + ldap_free_urldesc(lud); + ret = EINVAL; + goto done; + } + + if (lud->lud_host == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("The LDAP URI (%s) did not contain a host name\n", + ctx->service->sdap->uri)); + ldap_free_urldesc(lud); + ret = EINVAL; + goto done; + } + + state->servername = talloc_strdup(state, lud->lud_host); + ldap_free_urldesc(lud); + if (!state->servername) { + ret = ENOMEM; goto done; } @@ -214,7 +236,7 @@ ad_dyndns_update_send(struct ad_options *ctx) NULL, dp_opt_get_string(ctx->basic, AD_KRB5_REALM), - servername, + state->servername, dp_opt_get_int(ctx->dyndns_ctx->opts, DP_OPT_DYNDNS_TTL), false); -- cgit