summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2012-03-22 16:49:12 +0100
committerStephen Gallagher <sgallagh@redhat.com>2012-03-30 08:15:34 -0400
commit3b90d7fc44d93596322ab2d073e935a144721535 (patch)
treee0b6fd3bf132910325fa622a12bf706785884faa
parent99dfc685fbc6f8b06b8becb45264afe7b76b057f (diff)
downloadsssd-3b90d7fc44d93596322ab2d073e935a144721535.tar.gz
sssd-3b90d7fc44d93596322ab2d073e935a144721535.tar.xz
sssd-3b90d7fc44d93596322ab2d073e935a144721535.zip
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
-rw-r--r--src/providers/ldap/sdap_async_services.c18
-rw-r--r--src/providers/proxy/proxy_services.c74
-rw-r--r--src/util/usertools.c37
-rw-r--r--src/util/util.h4
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);