From 3b90d7fc44d93596322ab2d073e935a144721535 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Thu, 22 Mar 2012 16:49:12 +0100 Subject: Support lookup of services with case-insensitive protocol Add sss_get_cased_name_list utility function LDAP services: Save lowercased protocol names in case-insensitive domains https://fedorahosted.org/sssd/ticket/1260 Proxy services: Save lowercased protocol names and aliases in case-insensitive domains --- src/providers/ldap/sdap_async_services.c | 18 +++++++- src/providers/proxy/proxy_services.c | 74 ++++++++------------------------ src/util/usertools.c | 37 ++++++++++++++++ src/util/util.h | 4 ++ 4 files changed, 75 insertions(+), 58 deletions(-) diff --git a/src/providers/ldap/sdap_async_services.c b/src/providers/ldap/sdap_async_services.c index ae96d8882..c87d07c44 100644 --- a/src/providers/ldap/sdap_async_services.c +++ b/src/providers/ldap/sdap_async_services.c @@ -351,6 +351,8 @@ sdap_save_service(TALLOC_CTX *mem_ctx, const char *name = NULL; const char **aliases; const char **protocols; + const char **cased_protocols; + const char **store_protocols; char **missing; uint16_t port; uint64_t cache_timeout; @@ -412,6 +414,20 @@ sdap_save_service(TALLOC_CTX *mem_ctx, goto done; } + if (dom->case_sensitive == false) { + /* Don't perform the extra mallocs if not necessary */ + ret = sss_get_cased_name_list(tmp_ctx, protocols, + dom->case_sensitive, &cased_protocols); + if (ret != EOK) { + DEBUG(SSSDBG_MINOR_FAILURE, + ("Failed to get case_sensitive protocols names: [%s]\n", + strerror(ret))); + goto done; + } + } + + store_protocols = dom->case_sensitive ? protocols : cased_protocols; + /* Get the USN value, if available */ ret = sysdb_attrs_get_el(attrs, opts->service_map[SDAP_AT_SERVICE_USN].sys_name, &el); @@ -456,7 +472,7 @@ sdap_save_service(TALLOC_CTX *mem_ctx, cache_timeout = dom->service_timeout; - ret = sysdb_store_service(sysdb, name, port, aliases, protocols, + ret = sysdb_store_service(sysdb, name, port, aliases, store_protocols, svc_attrs, missing, cache_timeout, now); if (ret != EOK) { DEBUG(SSSDBG_MINOR_FAILURE, diff --git a/src/providers/proxy/proxy_services.c b/src/providers/proxy/proxy_services.c index e5654d75b..2b606064c 100644 --- a/src/providers/proxy/proxy_services.c +++ b/src/providers/proxy/proxy_services.c @@ -38,7 +38,6 @@ proxy_save_service(struct sysdb_ctx *sysdb, const char **protocols; const char **cased_aliases; TALLOC_CTX *tmp_ctx; - size_t num_aliases, i; time_t now = time(NULL); tmp_ctx = talloc_new(NULL); @@ -65,26 +64,11 @@ proxy_save_service(struct sysdb_ctx *sysdb, protocols[1] = NULL; /* Count the aliases */ - for(num_aliases = 0; svc->s_aliases[num_aliases]; num_aliases++); - - if (num_aliases >= 1) { - cased_aliases = talloc_array(tmp_ctx, const char *, num_aliases + 1); - if (!cased_aliases) { - ret = ENOMEM; - goto done; - } - - for (i = 0; i < num_aliases; i++) { - cased_aliases[i] = sss_get_cased_name(tmp_ctx, svc->s_aliases[i], - !lowercase); - if (!cased_aliases[i]) { - ret = ENOMEM; - goto done; - } - } - cased_aliases[num_aliases] = NULL; - } else { - cased_aliases = NULL; + ret = sss_get_cased_name_list(tmp_ctx, + (const char * const *) svc->s_aliases, + !lowercase, &cased_aliases); + if (ret != EOK) { + goto done; } ret = sysdb_store_service(sysdb, @@ -199,38 +183,6 @@ done: return ret; } -static errno_t -get_const_aliases(TALLOC_CTX *mem_ctx, - char **aliases, - const char ***const_aliases) -{ - errno_t ret; - size_t i, num_aliases; - const char **alias_list = NULL; - - for (num_aliases = 0; aliases[num_aliases]; num_aliases++); - - alias_list = talloc_zero_array(mem_ctx, const char *, num_aliases + 1); - if (!alias_list) return ENOMEM; - - for (i = 0; aliases[i]; i++) { - alias_list[i] = talloc_strdup(alias_list, aliases[i]); - if (!alias_list[i]) { - ret = ENOMEM; - goto done; - } - } - - ret = EOK; - *const_aliases = alias_list; - -done: - if (ret != EOK) { - talloc_zfree(alias_list); - } - return ret; -} - errno_t enum_services(struct proxy_id_ctx *ctx, struct sysdb_ctx *sysdb, @@ -246,6 +198,7 @@ enum_services(struct proxy_id_ctx *ctx, errno_t ret, sret; time_t now = time(NULL); const char *protocols[2] = { NULL, NULL }; + const char **cased_aliases; DEBUG(SSSDBG_TRACE_FUNC, ("Enumerating services\n")); @@ -320,10 +273,17 @@ again: ("Service found (%s, %d/%s)\n", svc->s_name, svc->s_port, svc->s_proto)); - protocols[0] = svc->s_proto; + protocols[0] = sss_get_cased_name(protocols, svc->s_proto, + dom->case_sensitive); + if (!protocols[0]) { + ret = ENOMEM; + goto done; + } + protocols[1] = NULL; - const char **const_aliases; - ret = get_const_aliases(tmpctx, svc->s_aliases, &const_aliases); + ret = sss_get_cased_name_list(tmpctx, + (const char * const *) svc->s_aliases, + dom->case_sensitive, &cased_aliases); if (ret != EOK) { /* Do not fail completely on errors. * Just report the failure to save and go on */ @@ -336,7 +296,7 @@ again: ret = sysdb_store_service(sysdb, svc->s_name, svc->s_port, - const_aliases, + cased_aliases, protocols, NULL, NULL, dom->service_timeout, diff --git a/src/util/usertools.c b/src/util/usertools.c index 64e8b1037..ff189e32f 100644 --- a/src/util/usertools.c +++ b/src/util/usertools.c @@ -182,3 +182,40 @@ sss_get_cased_name(TALLOC_CTX *mem_ctx, return case_sensitive ? talloc_strdup(mem_ctx, orig_name) : sss_tc_utf8_str_tolower(mem_ctx, orig_name); } + +errno_t +sss_get_cased_name_list(TALLOC_CTX *mem_ctx, const char * const *orig, + bool case_sensitive, const char ***_cased) +{ + const char **out; + size_t num, i; + + if (orig == NULL) { + *_cased = NULL; + return EOK; + } + + for (num=0; orig[num]; num++); /* count the num of strings */ + + if (num == 0) { + *_cased = NULL; + return EOK; + } + + out = talloc_array(mem_ctx, const char *, num + 1); + if (out == NULL) { + return ENOMEM; + } + + for (i = 0; i < num; i++) { + out[i] = sss_get_cased_name(out, orig[i], case_sensitive); + if (out[i] == NULL) { + talloc_free(out); + return ENOMEM; + } + } + + out[num] = NULL; + *_cased = out; + return EOK; +} diff --git a/src/util/util.h b/src/util/util.h index 7eb62a9b9..e1684d5be 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -405,6 +405,10 @@ char * sss_get_cased_name(TALLOC_CTX *mem_ctx, const char *orig_name, bool case_sensitive); +errno_t +sss_get_cased_name_list(TALLOC_CTX *mem_ctx, const char * const *orig, + bool case_sensitive, const char ***_cased); + /* from backup-file.c */ int backup_file(const char *src, int dbglvl); -- cgit